我知道在使用泛型时我们无法实例化未知类型的对象,即语句: T var = new T() 会给出编译时错误,我在一些搜索后使用 Reflections 尝试了它,但它没有编译并给出了我将在最后提到的错误
代码:
public class HelloWorld{
public static void main(String []args){
Pair<Integer> obj = new Pair<Integer>(Integer.class);
obj.<Integer>func();
}
}
class Pair<T>
{
T var;
<T> Pair(){}
<T> Pair(Class<T> reflection){
var = reflection.newInstance() ;
}
<T> void func(){
System.out.println(var);
}
}
错误:
HelloWorld.java:12: error: incompatible types: T#1 cannot be converted to T#2
var = reflection.newInstance() ;
^
where T#1,T#2 are type-variables:
T#1 extends Object declared in constructor <T#1>Pair(Class<T#1>)
T#2 extends Object declared in class Pair
我正在尝试查找错误原因,但无法找到它
最佳答案
class Pair<T>
{
T var;
<T> Pair(){}
<T> Pair(Class<T> reflection){
var = reflection.newInstance() ;
}
<T> void func(){
System.out.println(var);
}
}
<T>
构造函数和方法上的 s 定义了另一个类型变量,该变量隐藏了类上的变量。它们都被称为“T
”,但它们是不同的类型。
(零参数构造函数和 func
上的那些无论如何都未使用)。
删除这些额外的类型变量声明。
class Pair<T> {
T var;
Pair() {}
Pair(Class<T> reflection) {
var = reflection.newInstance();
}
void func() {
System.out.println(var);
}
}
然后你只需要处理这样一个事实:并非所有类都具有可访问的零参数构造函数;那newInstance()
抛出您需要处理的已检查异常。
更好的方法是提供 Supplier<T>
:
Pair(Supplier<T> reflection) {
var = reflection.get();
}
关于java - 使用反射实例化类型参数的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60433723/