在 Java 泛型代码内部,无法获取任何有关泛型参数类型的信息;
Java泛型时使用擦除实现的,当使用泛型代码时,任何具体的类型信息都会被擦除;而你唯一知道的是你在使用一个对象,List<String>和List<Integer>在运行的事实上都是相同的类型(这两种类型都会被擦除为它们的原生类型,即 List 或 List<Object>);
Java对类型擦除的常用补偿措施有以下:
在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());
}
在任何想要创建泛型数组的地方使用ArrayList<T>;
List<T> list = new ArrayList<T>();