1.1. 参数化类型的本质
Java参数化类型相对于C++的参数化类型而言,有本质区别。前者只是编译器的类型检查的一种手段,而后者则是真正的不利于原始类型的新的类型。
public class GenericParameterTest3 {
static class Hello{}
static class World{}
static class Generic<T>{}
public static void main(String[] args) {
//三者编译后的类型完全相同。
Generic g1 = new Generic();
System.out.println("Generic:" + g1.getClass());
Generic<Hello> g2 = new Generic<Hello>();
System.out.println("Generic<Hello>:" + g2.getClass());
Generic<World> g3 = new Generic<World>();
System.out.println("Generic<World>:" + g3.getClass());
//g1等于g2, g1等于g3
System.out.println(g1.getClass() == g2.getClass());
System.out.println(g1.getClass() == g3.getClass());
//编译错误。
//Generic<Hello> hello = new Generic<World>();
}
运行后发现,不同的类型参数组成的泛型类型,其class的类型都和原始类型的class的类型完全相同。不论实例化多少个泛型类型,编译后只会产生唯一一个class文件,加载后也只有唯一一个Class对象。
运行结果如下:
Generic:class com.test.javatechnology.genericparameter.GenericParameterTest3$Generic
Generic<Hello>:class com.test.javatechnology.genericparameter.GenericParameterTest3$Generic
Generic<World>:class com.test.javatechnology.genericparameter.GenericParameterTest3$Generic
true
true
Java的参数化类型的上述本质决定了不同类型参数组成的参数化类型之间可以进行强制类型转换。