我创建了这样的函数
public <T extends ClientCoporate> void myFunction(List<T> clients){
T client = new T(); // issue
....
}
IDE错误Cannot instantiate the type T
一个简单的问题,如何在这里扩展ClientCoporate
的任何类的新实例?我尝试搜索,但没有希望,如果您能找到任何重复的问题,请随时为我标记。谢谢。
答案 0 :(得分:10)
你不能。
因为泛型在运行时被删除,并且编译器不知道要创建哪种类型的对象。 T
只是一个占位符,因此尝试实例化它是非法的。
通常这个问题可以通过
解决public <T extends ClientCoporate> void myFunction(Class<T> clazz, List<T> clients){
T client = clazz.getDeclaredConstructor().newInstance(); ....
}
答案 1 :(得分:7)
您不能执行此操作的原因之一-尽管可能至少还有几个原因-是因为您在尝试构造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);