在Erased.java中对创建一个new T()的尝试无法实现,部分原因是擦除,另一部分原因是编译器不能验证T具有默人构造函数。但是在C++中,可以很安全。
Java中的解决方案是传递一个工厂对象,并使用它来创建新的实例。最便利的工厂对象就是Class对象,因此如果使用类型标签,可以使用newInstance()来创建这个类型的新对象:
class ClassFactory<T>{
T x;
public classAsFactory(Class<T> kind){
try{
x=kind.newInstance();
}catch(Excetion e)
}
}
但是这种方法对于classAsFactory<Integer>失败,因为Integer没有任何默认的构造器。这个错误不能再编译器期获得。采用显示的工厂对象
模板方法设计模式:get()是模板方法,而create()是子类中定义的,用来产生子类类型的对象: