我创建了这样的函数
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)
你不能做到这一点的原因之一 - 尽管可能至少还有一些 - 是因为在你试图构建它时,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)
| 归档时间: |
|
| 查看次数: |
112 次 |
| 最近记录: |