Java中如何在子类中修改继承自父类的成员属性的类型
核心前提说明
Java 的成员属性不存在重写机制,仅能发生「字段隐藏」,且父类中property的声明类型为List<String>,和HashSet<String>属于不兼容的集合类型,因此无法直接修改继承而来的成员属性的声明类型。
下面提供两种可行的落地方案:
方案1:可修改父类代码的最优解
将父类property的声明类型向上抽象为Collection<String>(List和Set都实现了Collection接口,且contains方法本身就是Collection接口定义的通用方法),子类构造器直接替换property的实现实例即可。
修改后父类代码:
public class ParentClass { protected Collection<String> property = null; public ParentClass() { this.property = new LinkedList<String>(); } //property在此处完成赋值 public boolean parentClassFunc(String where){ assert property != null; for(String it : property) { if(where.equals(it))return true; } return false ; } }
子类实现代码:
public class ChildClass extends ParentClass { public ChildClass() { // 直接替换父类property的实现为HashSet this.property = new HashSet<>(); // 此处需和父类逻辑对齐,完成property的元素赋值 } @Override public boolean parentClassFunc(String where){ assert property != null; return property.contains(where); } }
方案2:不可修改父类代码的兼容方案
在子类中新增独立的HashSet成员,构造阶段将父类property的元素全量拷贝到自有HashSet中,重写方法直接调用自有HashSet的contains方法。
子类实现代码:
public class ChildClass extends ParentClass { private HashSet<String> propertySet; public ChildClass() { // 先执行父类构造完成property的赋值 super(); // 全量拷贝元素到HashSet propertySet = new HashSet<>(property); } @Override public boolean parentClassFunc(String where){ assert propertySet != null; return propertySet.contains(where); } }
注意:如果父类
property会在运行时动态增删元素,需要额外增加同步逻辑,保证父类List和子类HashSet的数据一致性,否则会出现判断结果错误的问题。
不推荐的写法
不要在子类中定义同名的HashSet<String> property字段,这种写法只会隐藏父类的同名字段,实际会在对象中存在两份完全独立的存储,父类方法调用的还是原本的LinkedList,极容易出现数据不一致的问题。
内容的提问来源于stack exchange,提问作者Alen
相关产品推荐
相关产品推荐

