java - 我可以反射性地实例化 java 中的泛型类型吗?

标签 java generics reflection

是否可以在 Java 中反射性地实例化泛型类型?使用描述的技术 here我得到一个错误,因为类标记不能是通用的。以下面的例子为例。我想实例化一些实现 Creator 的 Creator 子类。实际的类名作为命令行参数传入。这个想法是能够在运行时指定 Creator 的实现。还有其他方法可以完成我在这里尝试做的事情吗?

public interface Creator<T> {
    T create();
}
public class StringCreator implements Creator<String> {
    public String create() { return new String(); }
}
public class FancyStringCreator implements Creator<String> {
    public String create() { return new StringBuffer().toString(); }
}
public static void main(String[] args) throws Exception {
    Class<?> someClass = Class.forName(args[0]);
    /*ERROR*/Class<? extends Creator<String>> creatorClass = someClass.asSubclass(Creator.class);
    Constructor<? extends Creator<String>> creatorCtor = creatorClass.getConstructor((Class<?>[]) null);
    Creator<String> creator = creatorCtor.newInstance((Object[]) null);
}

编辑:我喜欢 Marcus 的方法,因为它是最简单实用的方法,没有绕过整个泛型问题。我可以在我的情况下使用它,因为我可以指定传递的类必须是 StringCreator 的子类。但正如 Ericson 指出的那样,泛型信息仍然存在于类型级别,只是不存在于运行时级别,因此仍然可以反射(reflection)性地检查给定类是否实现了正确的泛型类型。

最佳答案

一般信息在运行时丢失。没有与 Creator.class 等效的运行时。您可以在 Creator 和 StringCreator 之间创建一个类型来修复通用类型:

public interface Creator<T> {
        T create();
}
public interface StringCreator extends Creator<String> { }
public class StringCreatorImpl implements StringCreator  {
        public String create() { return new String(); }
}
public class FancyStringCreator implements StringCreator  {
        public String create() { return new StringBuffer().toString(); }
}
public static void main(String[] args) throws Exception {
        Class<?> someClass = Class.forName(args[0]);
        Class<? extends StringCreator> creatorClass = someClass.asSubclass(StringCreator.class);
        Constructor<? extends StringCreator> creatorCtor = creatorClass.getConstructor((Class<?>[]) null);
        Creator<String> creator = creatorCtor.newInstance((Object[]) null);
}

但是当然你失去了一点灵 active ,因为你不能使用下面的创建者类:

public class AnotherCreator implements Creator<String> {
    public String create() { return ""; }
}

关于java - 我可以反射性地实例化 java 中的泛型类型吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/356583/

相关文章:

Yocto 构建上的 JAVA 安装错误

Java泛型从参数返回类型的子集合

javascript - REST API 的思考

java - 如何获取从不在类路径中的 jar 加载的任何类作为流?

java - 从 UTF-16LE 编码文件中删除非法 xml 字符

java - Spring Security Java 配置

java - 如何使用 java 和 xmlunit 比较两个具有相同命名空间但前缀不同的 xml

java - 在Java中,如何区分实现相同接口(interface)的类?

java - 不安全操作、未经检查的转换

ruby - 如何在当前上下文中评估另一个类的方法?