You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 03:35:44