以下的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类型
这样定义的类型没法实现对象的操作`