java的泛型是类型擦除的。
java泛型加强了参数类型的安全性,减少了类型转换,它与C++模板(template)非常类似,有不同,java的泛型在编译器有效,在运行期被删除。
import java.util.List;
public class Foo {
//overload
public void arrayMethod(String[] strArray) {
}
public void arrayMethod(Integer[] intArray) {
}
//overload
public void listMethod(List<String> stringList) {
}
public void listMethod(List<Integer> intList) {
}
}
编译后:
我们知道方法的重载类型应不同,我们得出的结论是List<Integer>和List<String>的类型是相同的。
我们做个测试
List<String> ls = new ArrayList<String>();
List<Integer> li = new ArrayList<Integer>();
System.out.println(ls.getClass() == li.getClass());
结果为:true
这边是java泛型引起的问题,在编译后所有的泛型做相应的转化。准换规则如下:
List<String>、List<Integer>、List<T>擦除后的类型是List
推而广之,List<String>[]、List<Integer>[]擦除后的类型为List[]
List<? extends E>,List<? super E>擦除后的类型为List<E>
所以泛型数组初始化时不能声明泛型类型,因为他们的擦除后类型相同。
List list = new ArrayList<String>();
list instanceof list<String>此类的表达都不能通过编译,因为泛型类型被擦除了。