使用java泛型时需要考虑一些限制。大多数限制都是由类型擦除引起的。
不能用基本类型实例化类型参数
不能用类型参数代替基本类型。因此,比如没有Pair,只有Pair。当然其原因是类型擦除。擦除之后,Pair类含有Object类型的域,而Object不能存储double值。
运行时类型查询只适用于原始类型
虚拟机中的对象总有特定的非泛型类型。因此,所有的类型查询只产生原始类型,例如:
下面的测试同样是错误的:
或者强制类型转换:
要记住这一点,instanceof不能与泛型一起使用来检查类型。用泛型类型进行强制类型转换,编译器也会发出警告。
同样的道理,getClass方法总是返回原始类型。例如:
package test;
public class Test {
public static void main(String[] args) {
Object s = new Pair();
Object i = new Pair();
System.out.println(s.getClass() == i.getClass()); //true
}
}
上例中,s.getClass()返回Pair.class,i.getClass()也是返回Pair.class,返回的都是原始类型。
不能创建参数化类型的数组
不能实例化参数化类型的数组,例如:
需要说明的是,只是不允许创建这些数组,而声明类型为Pair[]的变量仍是合法的,就如上面这个例子。