我不明白为什么我们不能这样做:
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发生了什么?
谢谢,
发布于 2011-05-10 23:19:30
这是因为Cloneable接口不是一个普通的接口,而是一个或多或少的标记接口,它向JVM保证实现它的类的clone方法是合法的并且实际有效。
正如文档所述,Cloneable接口不声明clone方法的签名。该方法在您从Object类声明的任何类中都会继承,但默认情况下它是protected。这就是为什么您应该通过在您声明的中间接口MyInterface中将其设为public来弱化此约束。
看看Java文档中给出的这个提示:
请注意,此接口不包含clone方法。因此,仅仅因为对象实现了该接口,就不可能克隆该对象。即使以反射方式调用克隆方法,也不能保证它会成功。
发布于 2011-05-10 23:16:47
Cloneable接口没有任何方法。
它只是一个标记接口,供base Object.clone method (即protected)检查。
如果你想要一个clone方法,你需要自己声明它。
发布于 2011-05-10 23:16:12
这只是因为clone()在Object中不是公共的。如果您在接口中声明了public Object clone() --换句话说,如果您的第一个示例与第二个示例相同--那么您的第一个示例就可以工作。
https://stackoverflow.com/questions/5952333
复制相似问题