簡體   English   中英

"我們應該@Override 接口的方法實現嗎?"

[英]Should we @Override an interface's method implementation?

實現接口方法的方法應該用@Override<\/code>注釋嗎?

Override<\/code>注釋的 javadoc<\/a>說:

表示方法聲明旨在覆蓋超類中的方法聲明。 如果一個方法被這個注解類型注解但沒有覆蓋超類方法,編譯器需要生成一個錯誤信息。

我不認為接口在技術上是超類。 或者是嗎?

問題闡述<\/a><\/kbd>

你應該盡可能使用@Override。 它可以防止出現簡單的錯誤。 例:

class C {
    @Override
    public boolean equals(SomeClass obj){
        // code ...
    }
}

這不會編譯,因為它沒有正確覆蓋public boolean equals(Object obj)

對於實現接口( 僅限1.6及更高版本 )或覆蓋超類的方法的方法也是如此。

我相信javac的行為已經改變了 - 用1.5它禁止了注釋,而1.6則沒有。 注釋提供額外的編譯時檢查,所以如果你使用1.6,我會去做。

如果方法可用,您應該始終使用@Override注釋方法。

在JDK 5中,這意味着重寫超類的方法,在JDK 6和7中,它意味着重寫超類的方法,並實現接口的方法。 如前所述,原因是它允許編譯器捕獲您認為重寫(或實現)方法的錯誤,但實際上是定義了一個新方法(不同的簽名)。

equals(Object)equals(YourObject)示例是一個標准的例子,但是可以為接口實現提供相同的參數。

我想象一下,注釋接口的實現方法並不是強制性的原因是JDK 5將此標記為編譯錯誤。 如果JDK 6強制使用此注釋,則會破壞向后兼容性。

我不是Eclipse用戶,但在其他IDE(IntelliJ)中,只有在項目設置為JDK 6+項目時,才會在實現接口方法時添加@Override注釋。 我認為Eclipse是類似的。

但是,我寧願看到這種用法的不同注釋,也許是@Implements注釋。

我會抓住每個機會。 請參閱何時使用Java的@Override注釋以及為什么?

如果要實現在接口中聲明的方法(其編譯錯誤),JDK 5.0不允許您使用@Override注釋,但JDK 6.0允許它。 因此,您可以根據需要配置項目首選項。

覆蓋從您自己的類繼承的自己的方法通常不會使用ide在重構上中斷。 但是如果重寫從庫繼承的方法,建議使用它。 如果你不這樣做,你通常會在以后的庫更改中沒有錯誤,但是一個隱藏得很好的錯誤。

如果具體類沒有覆蓋抽象方法,那么使用@Override進行實現是一個開放的問題,因為編譯器總是會警告你任何未實現的方法。 在這種情況下,一種說法可以提出,從可讀性減損-這是更多的東西在你的代碼讀取,並在較小程度上,它被稱為@Override ,而不是@Implement

這不是JDK的問題。 在Eclipse Helios中,它允許@Override注釋用於已實現的接口方法,無論使用哪個JDK 5或6.對於Eclipse Galileo,不允許使用@Override注釋,無論使用哪個JDK 5或6。

對我來說,這通常是一些代碼需要Java 6編譯的唯一原因。 不確定它是否值得。

當您在創建實現接口的類期間告訴它“生成未實現的方法”時,Eclipse本身將添加@Override注釋。

包含@Override的問題在於它讓你覺得你忘了調用super.theOverridenMethod()方法,這非常令人困惑 這應該是清晰的。 也許Java應該提供一個@Interface來在這里使用。 哦,還有另外一半的Java特性......

在java 6及更高版本中,您可以將@Override用於實現接口的方法。

但是,我認為它沒有意義:覆蓋意味着你在超類中擁有一個方法,並且你在子類中實現它。

如果你正在實現一個接口,我認為我們應該使用@Implement或其他東西,而不是@Override

通過讀取java8中的javadoc,您可以在接口Override的聲明中找到以下內容:

如果使用此批注類型對方法進行批注,則編譯器需要生成錯誤消息,除非至少滿足下列條件之一:

  • 該方法會覆蓋或實現在超類型中聲明的方法。
  • 該方法的簽名覆蓋等同於{@linkplain Object}中聲明的任何公共方法的簽名。

所以,至少在java8中,你應該在接口方法的實現上使用@Override。

對於接口,使用@Override導致編譯錯誤。 所以,我不得不刪除它。

錯誤消息“ The method getAllProducts() of type InMemoryProductRepository must override a superclass method ”。

它還顯示“ One quick fix available: Remove @Override annotation.

它是在Eclipse 4.6.3,JDK 1.8.0_144上。

如果實現interface的類是abstract類,則@Override可用於確保實現是用於interface方法; 沒有@Override ,即使實現方法簽名與interface聲明的方法不匹配, abstract類也可以正常編譯; 不匹配的interface方法將保持未實現狀態。 @Zhao引用的Java文檔

該方法會覆蓋或實現在超類型中聲明的方法

顯然是指一個abstract超級階級; 一個interface不能被稱為超類型。 因此, @Override是冗余的,對於具體類中的interface方法實現是不明智的。

這可能為時已晚。 但我希望這個例子能幫助人們理解為什么@override<\/code>如此重要(對於這樣的場景)

public interface Restaurant(){
    public boolean getBill();
    public BigDecimal payAmount();
}

public interface Food() extends Restaurant{
    public boolean haveSomeFood();
    public boolean drinkWater();
}

public class Hungry() implements Food{
    public boolean haveSomeFood(){}
    public boolean drinkWater(){}
    public boolean getBill(){}
    public BigDecimal payAmount(){}
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM