总结:泛型就是将运行时的转换异常提前到了编译时检测异常
在泛型类、泛型接口、泛型方法中,对于声明的泛型 E,我们可以把它当作一个真实存在的类,可以在参数,返回值中自由的使用E,只是不能创建E的对象,因为E是假想的类。在源文件编译后E会被替换成其父类,泛型类、泛型接口、泛型方法成为原生态类型(不存在泛型)。
在泛型类、泛型接口、泛型方法的使用中,对于真实的E 需要在编译时根据指定的具体类确定,之后在 调用具有泛型的方法上进行静态参数匹配检测与返回强转。然后擦除泛型信息,所以在运行时,所有的泛型对象都会转化成原生态类型,不存在泛型信息
注意点:不能创建 E List<E> List<String>
的泛型数组,可以使用List代替数组。至于为什么,因为Java中数组是协变可以具体化的,而泛型是可变可擦除的。两者混用会出现差错,从而违背泛型的设计理念:只要在程序中正确使用泛型,在编译时没有异常,就不会在运行时出现类型转化异常。
至于具体的例子,可以参考《Effective java》 p109