1.不能用基本类型实例化参数
例子:
List<int> testList = new ArrayList<int>(); //error
上面的语句会报错。根本原因是因为“类擦除(编译阶段发生的事情)”,擦除之后List类里面的泛型全被替换为Object, 而Object不能存储int的值。
2.不允许使用instanceOf运算符进行运行时类型检测
例子:
package test; public class test0926 { public static void main(String[] args) { B<String> b = new B<>(); System.out.println(b instanceof B<String>); //编译器报错 System.out.println(b instanceof B<?>);// true 因为问号表示通配符,表示任意类型,所以这里的B是泛型类。 System.out.println(b instanceof B);//true 这里B为原始类,而不是泛型类。 } } class B<T>{ private T a; public T getA() { return a; } public void setA(T a) { this.a = a; } }
结论:不能用instanceOf查询对象是否属于某个泛型类型,因为在虚拟机中,对象只有非泛型的类型。
同理,getClass方法返回的也是原始类型,例子:
package test; public class test0926 { public static void main(String[] args) { B<String> b = new B<>(); B<Character> c = new B<>(); System.out.println(c.getClass() == b.getClass()); //true,因为b,c的原始类型都是B } } class B<T>{ private T a; public T getA() { return a; } public void setA(T a) { this.a = a; } }
。。。未完待续