一:简单零碎的知识汇总
1)静态方法,静态初始化块或者静态变量的声明和初始化中不允许使用泛型。
2)
3)
4)指定了通配符上限的集合,只能从集合中取元素(取出的元素总是上限的类型),不能向集合中添加元素(因为编译器没法确认集合元素实际是哪种子类型)。详见书P354页
5) 对于更广泛的泛型类来说,指定通配符上限就是为了支持类型型变,比如Foo是Bar的子类,这样A<Foo>就相当于
A<? extends Bar>的子类,可以将A<Foo>赋值给A<? extends Bar>类型的变量,这种型变方式称为协变。
没有指定通配符上限的泛型类,相当于通配符上限是Object。
6) 指定通配符的下限就是为了支持类型型变。比如Foo是Bar的子类,当程序需要一个A<? super Foo>变量时,程序可以将A<Bar>,A<Object>赋值给A<? super Foo>类型的变量,这种型变方式被称为逆变。
7)Java中不允许创建一个泛型数组。
二:易混淆出错的难点汇总
1)如果程序显式指定了泛型构造器中声明的泛型形参的实际类型,则不可以使用菱形语法(即用一对尖括号表示泛型),如下