如何创建泛型类的新实例

Dan*_*yen 1 java

我创建了这样的函数

public <T extends ClientCoporate> void myFunction(List<T> clients){
    T client = new T(); // issue
    ....
}
Run Code Online (Sandbox Code Playgroud)

IDE错误 Cannot instantiate the type T

简单的问题,如何ClientCoporate在这里创建任何类的新实例?我试着搜索但没有希望,如果你能找到任何重复的问题,请随时给我一面旗帜.谢谢.

tal*_*lex 10

你不能.

因为泛型在运行时被擦除,并且编译器不知道要创建什么类型的对象.T只是一个占位符,因此尝试实例化它是非法的.

通常这个问题通过解决

public <T extends ClientCoporate> void myFunction(Class<T> clazz, List<T> clients){
    T client = clazz.getDeclaredConstructor().newInstance();        ....
}
Run Code Online (Sandbox Code Playgroud)


Mic*_*ael 7

你不能做到这一点的原因之一 - 尽管可能至少还有一些 - 是因为在你试图构建它时,T的具体类型是未知的.我们不能肯定T的具体类型有一个无参数构造函数.我们唯一知道的就是有方法ClientCoporate.

考虑以下课程:

class MyClientCoporate extends ClientCoporate // or implements, it doesn't matter
{
    private MyClientCoporate() {}
}
Run Code Online (Sandbox Code Playgroud)

我们无法new T()在此类上使用,因为构造函数不是公共的.这是编译器不允许它的一个原因.

如果你可以改变方法的签名,那么我会做这样的事情:

public <T extends ClientCoporate> void myFunction(List<T> clients, Supplier<T> constructor){
    T client = constructor.get();
    ...
}
Run Code Online (Sandbox Code Playgroud)

样品用法:

myFunction(aList, SomeClientCoporateClass::new);
Run Code Online (Sandbox Code Playgroud)