作者热门文章
- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
是否可以在 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
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/
我是一名优秀的程序员,十分优秀!