无法在类中实例化通用数据类型

h4c*_*k3d 19 java generics

我有一个不可变的类,具有以下布局,

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.

Ran*_*ggs 7

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)

  • 在完成时间T被Object取代 (2认同)

rus*_*tyx 5

在 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)

内置的无参数供应商接口可用作回调的包装器。


gku*_*min 1

在java语言中,泛型是通过擦除来实现的,因此不可能实例化泛型类型。而且也不可能初始化泛型类型的数组等等。

我怎样才能克服这个问题?我想将传递给 addData 的参数的新副本添加到我的列表中。

您可以尝试使用Cloneable接口作为类型绑定或添加您自己的类似接口。