【发布时间】:2017-09-27 17:25:34
【问题描述】:
我有一个不可变的类,具有以下布局,
public final class A <T> {
private ArrayList<T> myList;
private A(){
myList = new ArrayList<T>();
}
public A<T> addData(T t){
A newOb = // make a new list and instantiate using overloaded constructor
T newT = new T(); ***********ERROR HERE*************
newOb.myList.add(newT);
return newOb;
}
.........
}
我在这里得到的错误是 cannot instantiate type T 。现在,我认为这可能与 Java 中的 type erasure 有关。
我该如何克服这个问题?我想将传递给 addData 的参数的新副本添加到我的列表中。
【问题讨论】:
-
对象是在运行时创建的。所以我们在运行时需要适当的字节码。最大 Java 擦除可以将
T newT = new T();转换为Object newT = new Object()以在运行时可用。但这也是错误的,因为T可以是任何东西extends Object不仅仅是Object。因此编译器错误。