Java通用用法问题

时间:2010-10-16 17:14:43

标签: java generics

说我想做像

这样的事情
public class Container<C extends Member> {

    public void foo() {
        C newC = new C();
    }
}

我意识到这不起作用,但是这个正确的Java习语是什么?

2 个答案:

答案 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();
    }
}