如何在子类中通过Getter/Setter向父类的ArrayList添加元素
问题解决:向父类集合添加元素的错误修正
错误原因
你代码里的this.setAlphas(getAlphas().add(A))和this.setBetas(getBetas().add(B))会报错,核心问题是:
ArrayList.add()方法的返回值是boolean类型(仅表示元素是否成功添加)- 但父类的
setAlphas()/setBetas()方法要求传入ArrayList<Alpha>/ArrayList<Beta>类型的参数,两者类型不匹配导致编译错误。
另外要注意:你已经写了getAlphas().add(A),这行代码已经能直接向父类的alphas集合添加元素了,后面的setAlphas调用完全多余。
修复方案
方案1:直接使用现有get方法添加元素
不需要调用setAlphas/setBetas,直接通过getAlphas()/getBetas()拿到集合引用后调用add()即可,修改后的Meson构造方法如下:
public class Meson extends ImperialCluster { private static final long serialVersionUID = 1L; public Meson() { Alpha A = new Alpha(); Beta B = new Beta(); Gamma G = new Gamma(); // 直接向父类集合添加元素 getAlphas().add(A); // 若需要重复添加A,可再调用一次add,否则删除此行 // getAlphas().add(A); getBetas().add(B); getGammas().add(G); this.setClusterType("Meson"); } @Override public void displayCluster() { System.out.println(toString()); } }
方案2:优化父类封装,添加专属添加方法
如果希望提升父类的封装性(避免外部直接操作集合引用),可以在ImperialCluster中添加专门的元素添加方法,这样子类无需直接操作集合:
第一步:修改父类ImperialCluster
public abstract class ImperialCluster implements Serializable, Clusterable { private static final long serialVersionUID = 1L; private String clusterType; private ArrayList<Alpha> alphas; private ArrayList<Beta> betas; private ArrayList<Gamma> gammas; public ImperialCluster() { this.alphas = new ArrayList<>(); this.betas = new ArrayList<>(); this.gammas = new ArrayList<>(); } // 原有get/set方法保留,新增以下添加方法 public void addAlpha(Alpha alpha) { this.alphas.add(alpha); } public void addBeta(Beta beta) { this.betas.add(beta); } public void addGamma(Gamma gamma) { this.gammas.add(gamma); } // 原有toString等方法保留 }
第二步:修改子类Meson
public class Meson extends ImperialCluster { private static final long serialVersionUID = 1L; public Meson() { Alpha A = new Alpha(); Beta B = new Beta(); Gamma G = new Gamma(); // 调用父类提供的添加方法 addAlpha(A); // addAlpha(A); // 如需重复添加可保留此行 addBeta(B); addGamma(G); this.setClusterType("Meson"); } @Override public void displayCluster() { System.out.println(toString()); } }
这种方式的优势是父类可以统一控制集合的修改逻辑(比如添加元素前做合法性校验),同时避免外部代码意外修改集合的引用。
内容的提问来源于stack exchange,提问作者Tomas Gutierrez
相关产品推荐
相关产品推荐

