java - 跨子类的标准化构造函数?
问题描述
我有一个抽象类AbstractClass
和两个扩展它的非抽象类:A
和B
. 两者都A
具有B
接受参数的构造String
函数。我还有一个方法可以接收Class<? extends AbstractClass>
然后创建它的新实例。我怎样才能让所有的孩子在他们的构造函数中AbstractClass
都有一个?String
代码以防我在解释中不是很清楚:
public abstract class AbstractClass {
// do stuff
}
public class A extends AbstractClass {
public A(String str) {
// do stuff
}
}
public class B extends AbstractClass {
public B(String str) {
// do stuff
}
}
// this is stuff in other places
public void instantiateClass(Class<? extends AbstractClass> obj) {
AbstractClass object = obj.newInstance("blah"); // Error: Expected 0 arguments but found 1
// do stuff
}
instantiateClass(A.class);
instantiateClass(B.class);
解决方案
你不能。没有办法要求构造函数有任何参数。
但是,您传递 aFunction<? super String, ? extends AbstractClass>
而不是 a Class<? extends AbstractClass>
: 这样,您必须提供一个接受单个String
参数的东西,即使它不是专门的构造函数:
public void instantiateClass(Function<? super String, ? extends AbstractClass> fn) {
AbstractClass object = fn.apply("blah");
// do stuff
}
instantiateClass(A::new);
instantiateClass(B::new);
如果你有一个类的构造函数不接受单个String
参数:
public class C extends AbstractClass {
public C() {
// do stuff
}
}
然后instantiateClass(C::new)
不会编译;但instantiateClass(unused -> new C())
会。
推荐阅读
- docusignapi - Docu 标志回调 Ip 范围
- r - 如何在我的环境中自动创建更多模型,一次更改 3 个参数?
- local - certutil.exe 正在返回本地化输出
- php - 我有一个不能替换所有字符的功能
- node.js - 无法在 Windows 10 桌面上安装 NodeJS
- vba - 将前缀 vba 函数限制为动态范围
- r - 使用多层多边形构建的 ggplot 地图的手动图例
- flutter - 如果至少选择了一个复选框,如何激活按钮?- 颤振
- azure-data-factory - 将 Parquet 文件加载到 Azure Synapse 时失败
- css - Bootstrap Cards - 第三张卡片不高于同一行中的其他 2 张卡片