接口默认方法如何调用父类对象方法?以clone为例
替代接口中
clone()默认实现的方案 你遇到的问题是接口默认方法无法直接调用super.clone(),用抽象类会限制多继承,反射又会触发非法访问警告。以下是几种更优的替代方案:
方案一:强制实现类重写public的clone()方法
利用Object.clone()的特性,要求实现类将clone()重写为public方法并调用super.clone(),接口的默认方法直接调用这个重写后的方法:
public interface ICloneable extends Cloneable { default Object clone() throws CloneNotSupportedException { return this.clone(); // 调用实现类的public clone() } } public class MyEntity implements ICloneable { private String data; @Override public Object clone() throws CloneNotSupportedException { // 调用Object的原生clone(),实现浅拷贝 return super.clone(); } }
这种方式完全符合Java的访问权限规则,没有反射带来的警告,也保留了接口的多继承特性。
方案二:使用拷贝构造函数模式
放弃依赖Object.clone(),转而在接口中定义拷贝逻辑的规范,让实现类通过拷贝构造函数完成克隆,接口默认方法复用该逻辑:
public interface ICloneable<T> extends Cloneable { // 要求实现类提供拷贝构造函数的封装方法 T createCopy(T source); default T clone() { return createCopy((T) this); } } public class MyEntity implements ICloneable<MyEntity> { private String data; private List<String> items; // 无参构造 public MyEntity() {} // 拷贝构造函数,支持深拷贝(按需处理引用类型) public MyEntity(MyEntity source) { this.data = source.data; this.items = new ArrayList<>(source.items); // 深拷贝列表 } @Override public MyEntity createCopy(MyEntity source) { return new MyEntity(source); } }
这种方式更灵活,能自主控制浅拷贝/深拷贝逻辑,避免Object.clone()的隐式行为,同时完全避开反射的问题。
方案三:定义接口专属的克隆方法
如果不想依赖Cloneable接口和Object.clone(),可以在自定义接口中定义全新的克隆方法,让实现类实现具体逻辑:
public interface ICloneable<T> { default T cloneInstance() { // 默认实现抛出异常,强制实现类重写 throw new UnsupportedOperationException("请实现克隆逻辑"); } } public class MyEntity implements ICloneable<MyEntity> { private String data; @Override public MyEntity cloneInstance() { MyEntity clone = new MyEntity(); clone.data = this.data; return clone; } }
这种方式彻底脱离了Java原生的克隆机制,完全由开发者控制克隆行为,适合对克隆逻辑有特殊需求的场景。
内容的提问来源于stack exchange,提问作者Miguel Gamboa
相关产品推荐
相关产品推荐

