Java并没有真正实现泛型,是编译器在编译的时候在字节码上做了手脚,这种实现理念造成Java泛型本身有很多漏洞。为了规避这些问题Java对泛型的使用上做了一些约束,但不可避免的还是有一些问题存在。这其中大多数限制都是由类型擦除引起的。
1,不能用类型参数替换基本类型:
其原因是类型擦除,擦除类型后原先的类型参数被Object或者限定类型替换,而基本类型是不能被对象所存储的。可以使用它们的包装类。
2,运行时类型检查只是针对泛型类的原始类型进行的。getClass()方法只返回原始类型,因为JVM根本就不知道泛型这回事,它只知道原始类型。
在《Java Core》中提到的
Pair a = new Pair();
a instanceof Pair<String>为真的问题在JDK1.6上面已经不存在,这样的语句是通不过检查的,产生一个"instacneof 泛型类型不合法"的错误。
3,不能在静态域或者静态方法中引用类型变量。
4,不能实例化泛型类型。
5,类型擦除后的冲突。例如:
public class B<T>{
public void fun(T t){ ... }//方法1
public void fun(Object t){ ... }//方法2
}
这两个方法实际上是冲突的,类型擦除后它们具有相同的签名。
|