[英]Replace/override method of an object which is an implementation of an interface in Java
[英]Should we @Override an interface's method implementation?
實現接口方法的方法應該用
@Override<\/code>注釋嗎?
Override<\/code>注釋的 javadoc<\/a>說:
表示方法聲明旨在覆蓋超類中的方法聲明。 如果一個方法被這個注解類型注解但沒有覆蓋超類方法,編譯器需要生成一個錯誤信息。
我不認為接口在技術上是超類。 或者是嗎?
你應該盡可能使用@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的聲明中找到以下內容:
如果使用此批注類型對方法進行批注,則編譯器需要生成錯誤消息,除非至少滿足下列條件之一:
所以,至少在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.