2

我不明白为什么我们不能执行以下操作:

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
    }
}

但这会很好

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
    }
}

可克隆发生了什么?

谢谢,

4

3 回答 3

7

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

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

于 2011-05-10T15:16:46.520 回答
6

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

正如文档所述,Cloneable接口没有声明clone方法的签名。该方法在您从Object该类声明的任何类中固有地继承,但protected默认情况下它是。这就是为什么你应该通过在你声明public的中间接口中弱化这个约束。MyInterface

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

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

于 2011-05-10T15:19:29.647 回答
1

只是因为 clone() 在Object. 如果你public Object clone()在你的界面中声明——换句话说,如果你让你的第一个例子像你的第二个——那么你的第一个例子就可以工作。

于 2011-05-10T15:16:11.560 回答