在集合中使用泛型:
ArrayList
ArrayList<Integer> list = new ArrayList<Integer>();
泛型<Integer>指定数组中加入数据的类【指定的类型不能是基本数据类型,需要用他们的包装类】
泛型的嵌套:
以HashMap为例
Map<String,Integer> map = new HashMap<String, Integer>();
map.put("Tom",12);
Set<Map.Entry<String,Integer>> entrySet = map.entrySet();
Iterator<Map.Entry<String, Integer>> iterator = entrySet.iterator();
while (iterator.hasNext()){
Map.Entry<String, Integer> e = iterator.next();
System.out.println(e.getKey()+"\t"+e.getValue());
}
总结:
- 集合接口或集合类在jdk5.0时都修改为带泛型的结构
ii) 在实例化接口类时,可以指明具体的泛型类型
iii) 指明后,在集合类或接口中凡是定义类或接口时,内部结构(方法、构造器、属性等)使用到泛型的位置,都指定为实例化的泛型类型
add(E e)à实例化后add(Integer e)
iv) 如果实例化时,没有指明泛型的类型,默认为Object
自定义泛型类
如果定义了泛型类,实例化没有指明类的泛型,则认为泛型类型为Object类型
如果定义了类是带泛型的,在实例化时最好指明类的泛型
子类在继承带泛型的父类时,指明了泛型类型,则实例化子类对象时,不用再指明泛型类型
public class SubOrder extends Order<Integer> {//SubOrder不是泛型类,只是普通的类
SubOrder sub1 = new SubOrder();
sub1.setOrder(Integer e)【只能添加Integer类型的数据】
public class SubOrder1<T> extends Order<T> {//SubOrder1<T>是泛型类
SubOrder1<String> sub2 = new SubOrder1<String>();【可以重新定义泛型类型】
sub2.setOrder(String e)
泛型方法
在方法中出现了泛型的结构,泛型参数与类的泛型参数没有关系,即与类是不是带泛型的无关
public <E> List<E> copy(E[] arr){
}
【泛型方法的可以声明为静态的】原因:泛型参数是在调用方法时确定的,不是在实例化的时候确定的
public static <E> List<E> copy(E[] arr){
}
public和List中间的<E>如果不写,在编译时会将E误认为一个类型(如String),但其实泛型E是一个变量
通配符:?
类A是类B的父类,G<A>和G<B>没有关系的,二者的共同父类是:G<?>
List<Object> list1 = null;
List<String> list2 = null;
List<?> list = null;
public void print(List<?> list){
Iterator<?> iterator = list.iterator();
while (iterator.hasNext()){
Object obj = iterator.next();//Object是根父类,用他来接收
System.out.println(obj);
}
}
添加:对于List<?>不能向其内部添加数据,除了null
读取:允许读取数据,读取的数据类型为Object
Object o = list.get(int index);
有限制条件的通配符
? 可看作
? extends A→:
G< ? extends A > 可以接收G<A>和G<B>,其中B是A的子类【≤】
? super A→ :
G< ? super A > 可以接收G<A>和G<C>,其中C是A的父类【≥】
获取数据:
extends可用Object或A的对象接收【e≤A≤Object】
super只能用Object接收【A≤e≤Object】
写入数据:
extends不能写入
super可以写A或A的子类