为了使我的问题更清楚,我简化了名称和值,因为我的代码很长,并且有很多变量和方法。 这个问题完全等于我的问题:
我正在尝试创建一个具有两个构造函数的类B,并继承另一个名为A的类。
这是A:
的简化视图public class A {
int value1;
List<SpecialItem> itemList;
public SampleClass(int value1, List<SpecialItem> itemList) {
this.value1 = value1;
this.itemList = itemList;
}
现在,这是B的简化视图:
public class B {
public SampleClass(int value1, List<SpecialItem> itemList) {
super(value1,itemList);
}
public SampleClass(int value1) {
???
}
现在,问题是我想为B(其中???是)创建第二个构造函数,它不接收预定义的itemList,但创建自己的列表。 (对象SpecialItem是项目的同一个包中的另一个类)。
当然,我在定义构造函数时遇到问题,因为它不适用于A的构造函数。
我的目标是:
我要做的一件事是为没有itemList的A创建私有/包可见性构造函数,然后将其用作“超级”,但我不确定它是否是最佳解决方案。
会喜欢你的想法和反馈,
感谢。
答案 0 :(得分:1)
您似乎需要将默认列表传递给超类的构造函数。我会这样做:
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
的第二个构造函数委托给第一个构造函数,后者又调用超类A
的构造函数。 B
的第一个构造函数和A
的构造函数都需要List<SpecialItem>
作为其第二个参数。为此,我们使用的DEFAULT_ITEM_LIST
已在private static final
中定义为B
成员。
请注意,我已使用new ArrayList<>(Arrays.asList(...))
而非Arrays.asList(...)
。这是因为Arrays.asList
返回的列表不能在结构上进行修改(元素不能添加到其中或从中删除,尽管它们可以被其他元素替换)。接收另一个ArrayList
的{{1}}构造函数允许从另一个列表中创建一个公共的,可变的List
。