首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

相关JAVA泛型的笔记

2012-10-06 
有关JAVA泛型的笔记`??以下的4种都是可以通过的``??List? extends A list1 new ArrayListA()List?

有关JAVA泛型的笔记`

?

?

以下的4种都是可以通过的``

?

?

List<? extends A> list1 = new ArrayList<A>();

List<? extends A> list2 = new ArrayList<B>();

List<? super B> list3 = new ArrayList<B>();

List<? super B> list4 = new ArrayList<A>();

?

但应用起来使用extends 和super 有很大的差别

?

list1.add(new A());//非法,无法知道list1里内放的到底是A的哪一个子类,无法推断出类型

list1.add(new B());//非法,同上

A a1 = list1.get(0);//OK

B b1 = list1.get(0);//非法,无法从父类自动转换到子类

list3.add(new Object());//非法,list1里内存类型可能是从B到Object之间的某一级类,无法从父类Object自动转换到子类

list3.add(new A());//非法,同上

list3.add(new B());//OK

A a3 = list3.get(0);//非法,返回值类型为Object

Object b3 = list3.get(0);//OK

?

同样的对于泛型方法

?

public static <T extends A,S> Map<T, S> get(List<T> list,Vector<S> vector,List<? super B> listSuper) {

?

T tc = ?list.get(0);//OK

A ta = ?list.get(0);//OK

list.add(tc);//非法,无法自动将A转换为其子类

list.add(ta);//非法,无法自动将A转换为其子类

S s =vector.get(0);//OK

vector.add(s);//OK

listSuper.add(new B());//OK

listSuper.add(new Object());//非法,listSuper里内存类型可能是从B到Object之间的某一级类,无法从父类Object自动转换到子类

B b = listSuper.get(0);//非法,无法自动将B的父类转换为B类

Object obj = listSuper.get(0);//OK

return new HashMap<T, S>();

}

?

?

Java不支持<T super B>来给类或方法定义泛型,是因像上面listSuper一样`赋值只能是B类型,而取值只能是Object类型

?

这样定义的类型没法实现对象的操作`

?

?

?

热点排行