我不明白为什么我们不能做到以下几点:
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会发生什么?
谢谢,
答案 0 :(得分:7)
Cloneable
接口没有任何方法
它只是base Object.clone
method(protected
)检查的标记界面。
如果您需要clone
方法,则需要自行声明。
答案 1 :(得分:6)
这是因为Cloneable
接口不是普通接口,而是或多或少的标记接口,它向JVM确保实现它的类的clone
方法是合法的并且实际上正在工作。 / p>
正如文档所述,Cloneable
接口未声明clone
方法的签名。该方法本质上是在您从Object
类声明的任何类中继承的,但默认情况下为protected
。这就是为什么你应该通过在你声明的中间接口public
中使用MyInterface
来削弱这个约束。
看看Java doc中提供的这个提示:
请注意,此接口不包含克隆方法。因此,仅仅通过实现该接口的事实来克隆对象是不可能的。即使反射调用clone方法,也无法保证它会成功。
答案 2 :(得分:1)
这只是因为{(1}}中的clone()不公开。如果你在界面中声明Object
- 换句话说,如果你的第一个例子就像你的第二个那样 - 那么你的第一个例子就可以了。