我正在寻找一种返回新类型实例的方法,该实例可以扩展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实现此目标的最佳方法。任何想法表示赞赏。
答案 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();
}