java - 使用反射实例化类型参数的对象

标签 java generics reflection

我知道在使用泛型时我们无法实例化未知类型的对象,即语句: 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/

相关文章:

java - 使用 JCS : Failed to retrieve javax. sql :jdbc-stdext-2. 0 时出错

java - 放弃音频焦点并继续之前的音乐/视频流

java - 每当在 spring-security-oauth 中插入新的访问 token 时如何执行一些代码?

java - 自动确定 Junit 测试副作用

c# - 将程序集加载到子 AppDomain 并释放 dll 文件

swift - Swift 3 中的多个 NSFetchedResultsControllers

c# - 使用 EF6 为 CRUD 操作实现通用服务

从 NSObject 继承时,不会调用泛型中使用的 swift 子类

java - java中Method类的实例是否是全局唯一的

c# - 旧版 API 需要将回调名称作为字符串传递。我可以通过扩展方法改进该 API 吗?