Java接口扩展了Cloneable

Joh*_*nGa 2 java cloneable

我不明白为什么我们不能做到以下几点:

interface MyInterface extends Cloneable {}

class myClazz implements MyInterface {
    public Object clone() { return null; }
}

class test{
    public static void main(String[]a){
        MyInterface o = new myClazz();
        o.clone(); // IMPOSSIBLE
    }
}
Run Code Online (Sandbox Code Playgroud)

但这样做会很好

interface Misc{
    public void testM();
}

interface MyInterface extends Misc{}

class myClazz implements MyInterface {
    public void testM() {}
}

class test{
    public static void main(String[]a){
        MyInterface o = new myClazz();
        o.testM(); // OK
    }
}
Run Code Online (Sandbox Code Playgroud)

Cloneable会发生什么?

谢谢,

SLa*_*aks 7

Cloneable接口没有任何方法.
它只是基本Object.clone方法(它protected)检查的标记接口.

如果你想要一个clone方法,你需要自己声明.


Jac*_*ack 6

这是因为Cloneable接口不是普通的接口,而是或多或少的标记接口,它确保JVM clone实现它的类的方法合法且实际工作.

正如文档所述,Cloneable接口未声明clone方法的签名.该方法本质上是在您从Object类声明的任何类中继承的,但protected默认情况下是这样.这就是为什么你应该通过publicMyInterface你声明的中间接口中使用它来削弱这个约束.

看看Java doc中给出的这个提示:

请注意,此接口不包含克隆方法.因此,仅仅通过实现该接口的事实来克隆对象是不可能的.即使反射调用clone方法,也无法保证它会成功.