2011-05-10 88 views
2

我不明白爲什麼我們不能做到以下幾點: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的發生什麼事?

感謝,

+0

將Clone()方法添加到MyInterface接口。 – MeBigFatGuy 2011-05-10 15:26:14

回答

6

這是因爲Cloneable接口不是一個正常的接口,而是或多或少的一個標記接口,它確保JVM執行它的類的clone方法是合法的並且實際工作。

由於文檔說明Cloneable接口沒有聲明clone方法的簽名。該方法固有地繼承於您從Object類聲明的任何類中,但默認爲protected。這就是爲什麼你應該通過在你聲明的中間接口MyInterface中設置public來削弱這個限制。

看看在Java中DOC給出這樣的提示:

注意這個接口不包含clone方法。因此,僅憑藉其實現此接口的事實來克隆對象是不可能的。即使克隆方法是反射式調用,也不能保證它會成功。

1

這只是因爲克隆()是不是在Object公開。如果你在界面中聲明瞭public Object clone() - 換句話說,如果你的第一個例子像你的第二個例子 - 那麼你的第一個例子將工作。

6

Cloneable接口沒有任何方法。
這只是一個標記界面,其中base Object.clone method(它是protected)檢查。

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