我有一个不可变的类,具有以下布局,
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;
}
.........
}
Run Code Online (Sandbox Code Playgroud)
我在这里得到的错误是cannot instantiate type T.现在,我认为这可能type erasure与Java有关.
我怎么能克服这个?我想添加一个新的参数副本,该副本将传递给我的列表中的addData.
T newT = (T) t.getClass().newInstance() // assuming zero args constructor and you'll
// have to catch some reflection exceptions
Run Code Online (Sandbox Code Playgroud)
在 Java 8 中,您可以传递一个工厂 lambda,它将创建所需类型的新实例:
public final class A <T> {
private ArrayList<T> myList;
private A(){
myList = new ArrayList<T>();
}
public A<T> addData(Supplier<T> factory){
A newOb = // make a new list and instantiate using overloaded constructor
T newT = factory.get();
newOb.myList.add(newT);
return newOb;
}
.........
}
Run Code Online (Sandbox Code Playgroud)
例如,像这样使用它:
A<Integer> a = new A<>();
a.addData( () -> new Integer(0) );
Run Code Online (Sandbox Code Playgroud)
内置的无参数供应商接口可用作回调的包装器。
在java语言中,泛型是通过擦除来实现的,因此不可能实例化泛型类型。而且也不可能初始化泛型类型的数组等等。
我怎样才能克服这个问题?我想将传递给 addData 的参数的新副本添加到我的列表中。
您可以尝试使用Cloneable接口作为类型绑定或添加您自己的类似接口。