在 Java 泛型代码内部,无法获取任何有关泛型参数类型的信息;

Java泛型时使用擦除实现的,当使用泛型代码时,任何具体的类型信息都会被擦除;而你唯一知道的是你在使用一个对象,List<String>和List<Integer>在运行的事实上都是相同的类型(这两种类型都会被擦除为它们的原生类型,即 List 或 List<Object>);

Java对类型擦除的常用补偿措施有以下:

泛型对象 T 无法创建类型实例


在Java中,创建一个new T()是无法实现的,解决方案是传递一个工厂对象,并使用它来创建新的实例;其中最便利的工厂对象时Class类,使用 newInstance()方法来创建该类型的新对象;

Class<T> type = T.class;
T demo = type.newInstance();

※这种方法有缺陷:T类型可能没有默认的构造方法,如Integer,此时建议使用显性工厂对其进行限制;

interface Factory<T>{     //工厂类
     T create();
}
class Product<T>{          //产品类,转发泛型类型的载体,实现泛型T的实例化;
     private T x;
     public <F extends Factory<T>> Product(F factory){
          x = factory.create();
     }
}
//具体工厂类,回避Integer没有默认的构造方法,而带来的编译期无法捕获的异常;
class IntegerFactory implements Factory<Integer>{
     public Integer create(){     return new Integer(0);     }
}
//对某个类型使用其内部工厂类
class Widget{
     public static class WidgetFactory implements Factory<Widget>{
          public Widget create(){     return new Widget();     }
     }
}
main(){
     T intDemo = new Productor<Inetegr>(new IntegerFactory());
     T widgetDemo = new Prodoctor<Widget>(new Widget.WidgetFactory());
}

无法创建泛型数组


方式1:使用 ArrayList 代替

在任何想要创建泛型数组的地方使用ArrayList<T>;

List<T> list = new ArrayList<T>();