Java接口扩展了Cloneable

时间:2011-05-10 15:15:00

标签: 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
    }
}

但这样可以正常使用

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

Cloneable会发生什么?

谢谢,

3 个答案:

答案 0 :(得分:7)

Cloneable接口没有任何方法 它只是base Object.clone methodprotected)检查的标记界面。

如果您需要clone方法,则需要自行声明。

答案 1 :(得分:6)

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

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

看看Java doc中提供的这个提示:

  

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

答案 2 :(得分:1)

这只是因为{(1}}中的clone()不公开。如果你在界面中声明Object - 换句话说,如果你的第一个例子就像你的第二个那样 - 那么你的第一个例子就可以了。