无法在类中实例化泛型数据类型

2022-09-02 01:53:17

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

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;
    }
    .........
}

我在这里得到的错误是 。现在,我认为这可能与Java有关。cannot instantiate type Ttype erasure

我该如何克服这个问题?我想添加正在传递的参数的新副本,以将数据添加到我的列表中。


答案 1
T newT = (T) t.getClass().newInstance() // assuming zero args constructor and you'll
                                        // have to catch some reflection exceptions

答案 2

在Java 8中,您可以传递一个工厂lambda,该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;
    }
    .........
}

例如,像这样使用它:

A<Integer> a = new A<>();
a.addData( () -> new Integer(0) );

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


推荐