如何在Java接口中定义默认clone()方法?解决权限冲突报错
接口默认方法clone()的权限冲突问题解决
问题代码
public interface ICloneable { default ICloneable clone() throws CloneNotSupportedException { throw new CloneNotSupportedException(); } public static void main(String[] args) { var object = new ICloneable() { }; System.out.println("ok"); } }
编译错误信息
ICloneable.java:9: error: clone() in Object cannot implement clone() in ICloneable var object = new ICloneable() { ^ attempting to assign weaker access privileges; was public
问题原因
Object类自带的clone()方法是protected权限,而你在接口中定义的clone()默认方法是public权限。当创建匿名内部类实现接口时,编译器会默认用Object的protected方法去匹配接口的public方法,这违反了"实现接口方法时权限不能比接口定义的更严格"的规则,因此触发报错。
解决办法
有两种可行的解决方式:
方式一:显式重写public的clone()方法
在匿名内部类里手动实现clone(),明确指定public权限,既符合接口要求,也覆盖了Object的protected方法:
var object = new ICloneable() { @Override public ICloneable clone() throws CloneNotSupportedException { // 可根据需求实现自定义克隆逻辑,或调用super.clone()(需确保类实现Cloneable接口) return (ICloneable) super.clone(); } };
如果仅为通过编译,也可以直接抛出异常:
var object = new ICloneable() { @Override public ICloneable clone() throws CloneNotSupportedException { throw new CloneNotSupportedException("克隆不被支持"); } };
方式二:修改接口方法名避开冲突
如果不是必须使用clone作为方法名,可以修改接口里的方法名,比如改成deepClone或copy,彻底避免和Object类的方法冲突:
public interface ICloneable { default ICloneable deepClone() throws CloneNotSupportedException { throw new CloneNotSupportedException(); } public static void main(String[] args) { var object = new ICloneable() {}; System.out.println("ok"); } }
内容的提问来源于stack exchange,提问作者Dims
相关产品推荐
相关产品推荐

