【发布时间】:2008-12-10 16:01:47
【问题描述】:
是否可以在 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 指出的,泛型信息仍然存在于类型级别,只是不在运行时级别,因此仍然可以反思性地检查给定类是否实现了正确的泛型类型。
【问题讨论】:
标签: java generics reflection