java - 从该方法参数的属性获取方法返回类型

标签 java generics

我有一个带有内部 Class 属性的 C 类:

public class C{
   private Class<?> clazz;

   public void setClazz(Class<?> c){
      this.clazz = c;
   }

   public Class<?> getClazz(){
      return clazz;
   }
}

我想在另一个类中声明一个方法,因此它的返回类型是 C.clazz 的返回类型:

public class D{
    public <T> T getInstance(C c){
       //doesn't compile
       //some reflective code to set T to c.getClazz?
       return (c.getClazz.newInstance());
    }
}  

例如,getInstance(c),其中 c 的 clazz 设置为 Class<B> ,会返回 B 的一个新实例。有没有办法通过反射来做到这一点?

最佳答案

class C<T>{
    private final Class<T> clazz;

    C(Class<T> clazz) {
        this.clazz = clazz;
    }

    public Class<T> getClazz(){
        return clazz;
    }
}

class D{
    public <T> T getInstance(C<T> t) throws IllegalAccessException, InstantiationException {
        return t.getClazz().newInstance();
    }
}


public static void main() throws Exception {
    C<String> c = new C<>(String.class);
    D d = new D();
    String s = d.getInstance(c);
    System.out.println("String = " + s);
}

这也是存储通用类型信息的经典方式。但我不明白为什么你会想要 D 中的 getInstace 方法。我宁愿将其设为 C 内的静态方法。

即使它是一个带有 java.lang.reflect.Array.newInstance(t.getClazz(),10); 的数组,您也可以采用类似的策略,而不仅仅是 t.getClazz ().newInstance()

甚至还有其他方法来捕获通用类型信息。 Read这适用于更复杂的事情。

关于java - 从该方法参数的属性获取方法返回类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30328116/

相关文章:

java - 通过 @Context 在无状态 session Bean 中使用 http session

java - 特定HQL查询( hibernate )的连接错误预期路径

java - 我可以在注释中使用类类型参数吗?

arrays - 从数组中删除数组项

java - 从通用类型参数中检索高级信息

java - PayPal 金额只能增加 20%

java - 正则表达式 Lookahead 未按预期匹配

c# - 奇怪的通用行为

generics - Rust 泛型 : Expected <T> found <Foo>

java - 警告 : [unchecked] unchecked cast. 泛型