Java interface中方法和Object方法衝突

在看java.util.Collection的時候,發現Collection有兩個方法標註的是繼承自Object:

當時就納悶了;雖然知道Java中所有的類都隱式地繼承自Object,但是Collection是個interface啊。出於好奇的我就寫了下面的測試代碼:

public interface MyInterface {
    void toString();//toString() in cn.jerry.jerrydemo.MyInterface clashes with toString() in java.lang.Object;Attempting to use incompatible return type
}

toString()後面的註釋就是IDE在編譯時給出的error,意思就是我這個Interface中的toString方法和Object中的toString方法衝突了,原因是返回值類型不同。

Why

我們知道,如果一個子類繼承了父類的一個方法,如果這兩個方法的簽名(一個方法的簽名包括:方法名和參數)一致,那麼我們就知道:子類override了父類的方法;(如果簽名不一致,要麼這兩個方法沒鳥關係,要麼是重載);在override時,如果該方法的返回值類型不一致,或者子類該方法的訪問權限修飾符低於父類該方法的訪問權限修飾符,那麼就會clash。

接着我們的主題:

爲什麼接口中和Object某個方法的簽名一致而返回值類型不一致也會clash呢?

我們又知道,interface是一個特殊的數據類型,它超出三界之外,不受Object控制,也就是說它沒有繼承自Object,override Object的function也就無從談起。那麼clash從何而來呢?

要解答這個問題,我們就需要知道以下內容:

一個Interface在Java中是不可以直接使用的。也就是說不可以直接new。如果要使用,必須使用它的實現類(implementation)。比如說你一個A類實現了我上面的那個MyInterface接口,那麼它就必須要實現void toString()方法,這個toString()方法和Object中的toString()方法的簽名是一致的;但是—-返回值不同。我擦,這個時候就clash了。

結論

接口雖然和Object沒啥鳥關係,但是它的實現類肯定是間接或直接繼承自Object,你interface中有方法和Object中的某個方法簽名一致而返回值不同(不會因爲訪問權限不同而衝突,因爲interface中所有方法都是public的),那麼它的子類就會產生clash。衝突產生自implementation,但是要從根源上杜絕clash,因此在interface中報錯。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章