为了让我的问题更清楚,我简化了名称和值,因为我的代码很长并且有很多变量和方法。 这个问题与我的问题完全一样:
我正在尝试创建一个具有两个构造函数的类 B,并继承另一个名为 A 的类。
这是 A 的简化 View :
public class A {
int value1;
List<SpecialItem> itemList;
public SampleClass(int value1, List<SpecialItem> itemList) {
this.value1 = value1;
this.itemList = itemList;
}
现在,这是 B 的简化 View :
public class B {
public SampleClass(int value1, List<SpecialItem> itemList) {
super(value1,itemList);
}
public SampleClass(int value1) {
???
}
现在,问题是我想为 B 创建第二个构造函数(其中 ??? 所在的位置),它不接收预定义的 itemList,而是创建自己的列表。 (对象SpecialItem是项目同一包中的另一个类)。
当然,我在定义该构造函数时遇到问题,因为它不适用于 A 的构造函数。
我的目标是:
- 不要给启动 A 实例的机会 给定的项目列表。
- 有一个 B 的构造函数,它不提供 itemList,而是创建我想要的 itemList 并将其“种植”在 B 中。例如,该列表将只有一个由以下方法创建的 SpecialItem 类型的对象我给它的参数。
我的一件事是为 A 创建一个不带 itemList 的私有(private)/包可见性构造函数,然后将其用作“ super ”,但我不确定这是否是最佳解决方案。
希望得到您的想法和反馈,
谢谢。
最佳答案
您似乎需要将默认列表传递给父类(super class)的构造函数。我会这样做:
public class B {
private static final List<SpecialItem> DEFAULT_ITEM_LIST =
new ArrayList<>(Arrays.asList(new SpecialItem()));
public SampleClass(int value1, List<SpecialItem> itemList) {
super(value1, itemList);
}
public SampleClass(int value1) {
this(value1, DEFAULT_ITEM_LIST);
}
}
B
的第二个构造函数委托(delegate)给第一个,后者又调用父类(super class) A
的构造函数。都是 B
的第一个构造函数和 A
的构造函数需要 List<SpecialItem>
作为它的第二个参数。为此,我们使用 DEFAULT_ITEM_LIST
,它被定义为 private static final
B
中的成员.
请注意,我使用了 new ArrayList<>(Arrays.asList(...))
而不仅仅是Arrays.asList(...)
。这是因为 Arrays.asList
返回的列表不能在结构上进行修改(元素不能添加到其中或从中删除,尽管它们可以被其他元素替换)。 ArrayList
的构造函数接收另一个 List
允许创建一个通用的、可变的 List
从另一个列表中。
关于Java - 具有预定义继承值的构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44445508/