我不明白为什么我们不能做到以下几点:
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
}
}
Run Code Online (Sandbox Code Playgroud)
但这样做会很好
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
}
}
Run Code Online (Sandbox Code Playgroud)
Cloneable会发生什么?
谢谢,
这是因为Cloneable接口不是普通的接口,而是或多或少的标记接口,它确保JVM clone实现它的类的方法合法且实际工作.
正如文档所述,Cloneable接口未声明clone方法的签名.该方法本质上是在您从Object类声明的任何类中继承的,但protected默认情况下是这样.这就是为什么你应该通过public在MyInterface你声明的中间接口中使用它来削弱这个约束.
看看Java doc中给出的这个提示:
请注意,此接口不包含克隆方法.因此,仅仅通过实现该接口的事实来克隆对象是不可能的.即使反射调用clone方法,也无法保证它会成功.
| 归档时间: |
|
| 查看次数: |
4817 次 |
| 最近记录: |