约束1:不能使用基本类型来作为泛型的抽象类型的实际参数
这是因为在JVM中是没有抽象类型的,所以泛型中的抽象类型会被替换成Object类型(该行为叫擦除),而基本类型不能直接赋值给Object类型,要使用基本类型则要使用它们的封装类。
需要注意的是:
Object obj=1;
虽然是可行的写法,但这涉及到自动装包解包的过程,即它实际上做的是:
Object obj=new Integer(1);
约束2:有关运行时的类型检查
这样做是行不通的,而只能检查属于哪个泛型类:
这也是因为JVM的擦除导致的,参数T被替换成了Object。
又如:
package day37;
class MyClass<T>{
}
class Person{
}
public class Test {
public static void main(String[] args) {
MyClass<String> c1=new MyClass<String>();
MyClass<Person> c2=new MyClass<Person>();
System.out.println(c1.getClass());
System.out.println(c2.getClass());
}
}
运行结果:
class day37.MyClass
class day37.MyClass
约束3:有关异常处理
①不能抛掷或捕获泛型类的对象,因它不能继承Exception类来实现自己的异常类。
②不能用catch捕获抽象类型变量的对象。
约束4:不能声明一个参数化类型的数组
约束5:泛型类型的抽象参数不能被实例化
约束6:不能在静态属性或方法中使用泛型类型
约束7:擦除后的冲突
首先任何类必继承Object类,所以必有Object类的方法:
public boolean equals(Object obj){
//...
}
前面写的那个equals方法和这个方法并不是覆盖关系(因为方法的参数不同),而在JVM中做了擦除后,T变成了Object,两个方法就产生了冲突。