说我想做像
这样的事情public class Container<C extends Member> {
public void foo() {
C newC = new C();
}
}
我意识到这不起作用,但是这个正确的Java习语是什么?
答案 0 :(得分:2)
泛型类型C在运行时被擦除到java.lang.Object。无法实例化已擦除的泛型类型。看起来你想要某种工厂创作模式?
abstract class MemberFactory {
public static <T> Member create(Class<T> memberClass) throws Exception {
return memberClass.newInstance();
}
}
Member premiumMember = MemberFactory.create(PremiumMember.class);
如果是这种情况,您可能希望查看使用依赖注入和框架,如Spring或Guice。
答案 1 :(得分:1)
典型的习惯用法是生成在构造函数中传递的类型标记:
public class Container<C extends Member> {
private Class<C> tag;
public Container(Class<C> tag) {
this.tag = tag;
}
public void foo() {
C newC = tag.newInstance();
}
}