静态助手中的泛型工厂

时间:2019-01-11 07:59:22

标签: java generics

我正在寻找一种返回新类型实例的方法,该实例可以扩展Java中的abstract类,理想情况下无需静态方法的反射。

所以我想打电话给

SomeClass anInstanceOfSomeClass = Builder.build<SomeClass>()

我希望我可以做类似的事情:

public class Builder {

    public static <T extends SomeBaseClass> T build() {                             
        return new T(); // cannot instantiate type T            
    }

}

我已经看到一些使用Supplier的示例,但是它们倾向于基于非静态,使用泛型类而不是方法和/或需要将ctor作为参数似乎在语法上更加复杂。

这样的感觉应该很简单,但是来自C#,我不太熟悉用Java实现此目标的最佳方法。任何想法表示赞赏。

2 个答案:

答案 0 :(得分:2)

您必须通过要创建的实际课程。 T在运行时变成Object,因此JVM不知道应该创建哪种类型(假设只是)

public static <T extends SomeBaseClass> T build(Class<T>clazz) {                             
         return clazz.newInstance();
    }

通话将像您期望的那样简单

SomeClass anInstanceOfSomeClass = Builder.build(SomeClass.class);

坚持使用Java的命名约定(ClassName和methodName)

答案 1 :(得分:2)

这里的供应商很好:

(**A)->caracterise

它避免了反射和异常处理。

并使用它,例如:

public static <T extends SomeBaseClass> T build(Supplier<T> supplier){ 
   return supplier.get(); 
}