繁体   English   中英

如何创建泛型类的新实例

[英]How can I create a new instance of a generic class

我创建一个这样的功能

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

IDE错误Cannot instantiate the type T

一个简单的问题,如何在这里扩展ClientCoporate的任何类的新实例? 我尝试搜索,但没有希望,如果您能找到任何重复的问题,请随时为我标记。 谢谢。

你不能

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

通常这个问题可以通过解决

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

您不能执行此操作的原因之一-尽管可能至少还有几个原因-是因为在您试图构造T的那一刻,T的具体类型尚不明确。 我们不能肯定地说T的具体类型具有无参数构造函数。 我们唯一知道的是在ClientCoporate有方法。

考虑以下类别:

class MyClientCoporate extends ClientCoporate // or implements, it doesn't matter
{
    private MyClientCoporate() {}
}

我们不能在此类上使用new T() ,因为构造函数不是公共的。 这是编译器不允许这样做的原因之一。

如果您可以更改方法的签名,则可以执行以下操作:

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

用法示例:

myFunction(aList, SomeClientCoporateClass::new);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM