如何仅通过泛型类型 T 创建实例

Spe*_*ius 2 java generics

我想通过定义泛型类的类型来创建一个实例

public abstract class Base<T> {
    private final T genericTypeObject;

    protected Base(){
          //Create instance of T here without any argument

    }
}
Run Code Online (Sandbox Code Playgroud)

这样我就可以调用默认构造函数:

public class Child extends Base<SomeClass>{
    public Child () {
        super();
    }
}
Run Code Online (Sandbox Code Playgroud)

基类实现将为我创建一个 GenericType 的实例。

JDC*_*JDC 5

通用信息将在编译时删除,因此在运行时T不再存在(您丢失了信息)。这就是为什么你在某个地方需要一个来存储信息。Class<>


我认为最干净和简单的解决方案是将类传递给构造函数。我知道你要求它没有任何构造函数参数,但我认为这是不可能的。


代码示例

public abstract class AbstractBase<T> {

    private final T genericTypeObject;

    protected Base(Class<T> type){
        try {
            genericTypeObject = type.newInstance();
        } catch (InstantiationException e) {
            // Handle
        } catch (IllegalAccessException e) {
            // Handle
        }
    }
}
Run Code Online (Sandbox Code Playgroud)
public class Child extends Base<SomeClass> {

    public Child () {
        super(SomeClass.class);
    }
}
Run Code Online (Sandbox Code Playgroud)

替代方案

使用Supplier(感谢@Jorn Vernee 的评论):

public abstract class AbstractBase<T> {

  private final T genericTypeObject;

  public AbstractBase(Supplier<T> supplier) {
    genericTypeObject = supplier.get();
  }
}
Run Code Online (Sandbox Code Playgroud)
public class Child extends AbstractBase<SomeClass> {

  public Child() {
    super(SomeClass::new);
  }
}
Run Code Online (Sandbox Code Playgroud)