【发布时间】:2021-11-22 17:34:15
【问题描述】:
我希望能够在类型为抽象的变量中创建一个类的新实例。
class Scratch {
public static void main(String[] args) {
Implementation implementation = new Implementation();
// ...Later in the code Implementation is abstracted away and it's AbstractClass
AbstractClass implementedAbstractClass = implementation;
AbstractClass newInstance = implementedAbstractClass.newInstance();
}
}
abstract class AbstractClass {
protected abstract AbstractClass createNewInstance();
public AbstractClass newInstance() {
return createNewInstance();
}
}
class Implementation extends AbstractClass {
@Override
protected AbstractClass createNewInstance() {
return new Implementation();
}
}
这可行,但我想避免在我所做的每个实现中都必须实现 createNewInstance() 的样板。
我尝试更改 AbstractClass 以接受类型参数:AbstractClass<T extends AbstractClass<T>>,然后是 Implementation extends AbstractClass<Implementation>
然后调用new T(),当然这也不起作用,因为Java在编译时不知道T是什么,所以它不能在类文件中添加构造指令。
之后我尝试调用AbstractClass.class.getDeclaredConstructor().newInstance(),但这更没有意义,因为我只是在尝试构造一个 AbstractClass 的实例,这是不可能的,因为它是抽象的,也不是我需要的。
【问题讨论】:
-
与stackoverflow.com/questions/56385734/… 相关但不重复,因为该问题希望从静态上下文中实例化。
-
您可以将构造函数作为方法引用传递:
super(Implementation::new)。但是没有办法在抽象中安全地引用构造函数,因为构造函数不是继承的。 -
@shmosel 效果很好,我学到了一些关于函数式接口的新知识。如果我将您的评论转化为答案,您介意吗?
-
我实际上开始写它作为答案,但将其更改为评论,因为感觉有点不满意。不过我会发给你的。
-
我花了几个步骤和一些研究才能在我的示例代码中实现它,这就是为什么如果它是一个完整的答案并显示实现它会很有用。我相信这将是一个很好的答案! :)
标签: java abstract-class instantiation