是否有可能在Java中反射性地实例化泛型类型?使用描述的技术here我收到错误,因为类令牌不能通用。以下面的例子。我想实例化实现Creator的Creator的一些子类。实际的类名称作为命令行参数传入。这个想法是能够在运行时指定Creator的实现。有没有另一种方法来完成我在这里要做的事情?可以反思性地实例化java中的泛型类型吗?
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);
}
编辑:我喜欢马库斯的方法,因为它是最简单实用的方法,没有规避整体的泛型。我可以在我的情况中使用它,因为我可以指定传递的类必须是StringCreator的子类。但是正如Ericson所指出的那样,通用信息仍然存在于类型级别,而不是在运行级别,所以仍然可以反思性地检查给定的类是否实现了正确的泛型类型。
并非所有通用信息在运行时都会丢失;即使没有创建另一个界面,也有足够的时间检查必要的类型信息。只是没有足够的信息让编译器推断正确性。 – erickson 2008-12-10 19:48:48