首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java接口扩展了Cloneable

Java接口扩展了Cloneable
EN

Stack Overflow用户
提问于 2011-05-10 23:15:00
回答 3查看 5.7K关注 0票数 2

我不明白为什么我们不能这样做:

代码语言:javascript
复制
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
    }
}

但是这将会很好的工作

代码语言:javascript
复制
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发生了什么?

谢谢,

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-05-10 23:19:30

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

正如文档所述,Cloneable接口不声明clone方法的签名。该方法在您从Object类声明的任何类中都会继承,但默认情况下它是protected。这就是为什么您应该通过在您声明的中间接口MyInterface中将其设为public来弱化此约束。

看看Java文档中给出的这个提示:

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

票数 6
EN

Stack Overflow用户

发布于 2011-05-10 23:16:47

Cloneable接口没有任何方法。

它只是一个标记接口,供base Object.clone method (即protected)检查。

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

票数 7
EN

Stack Overflow用户

发布于 2011-05-10 23:16:12

这只是因为clone()在Object中不是公共的。如果您在接口中声明了public Object clone() --换句话说,如果您的第一个示例与第二个示例相同--那么您的第一个示例就可以工作。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5952333

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档