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;
    }
    
}

。。。未完待续