前言:Java的泛型真是狗屎!
一、泛型里的强制转换
在阅读 Core Java 和 ArrayList 源码时,一直有一个问题困扰着我:既然泛型都会被擦出成raw type(这里被擦除为Object),那么为什么还会有(T) 或(T[ ])这种强制转换呢?这岂不是闲的没事儿干?
public class Test<E> {
private Object[] elem;
public E get(int index) {return (E)elem[index];} // ????????????黑人问号脸
public void set(int index, T e) {elem[index] = e;}
}
如果对泛型理解不深刻的小伙伴一定会觉得去掉(E[ ])强制转换也是可以的。如果你自己试一下的话,相信一定会有一个大大的编译错误等着你。
为什么呢?永远要记住,Java的弱鸡泛型是编译期技术,换句话说也就是Java的泛型只存在于你在eclipse/IDEA按下运行按钮的那一刻之前。在编译期,并没有类型擦除,所以在编译器看来你自己定义的类型T是真实存在的类,和String、Integer等类没有区别。所以你必须对Object[ ]加入强制转换。但这会又会出现一个“unchecked”警告