2009-07-31 70 views
12

考慮以下簡化的界面的傳承層次結構:Java:如何避免派生接口中的棄用警告,該警告會覆蓋棄用的成員?

// Starting point: 
public interface Base { 
    void Foo(); 
} 

public interface Derived extends Base { 
} 

它的目的是從Base界面移動Foo方法將Derived接口:

// Desired end-point: 
public interface Base { 
} 

public interface Derived extends Base { 
    void Foo(); 
} 

爲了相在此重大更改,期望在一段時間內保持接口的向後兼容性。

// Intermediate state: 
public interface Base { 
    /** 
    * @deprecated This method is deprecated as of release X. Derived.Foo should be used instead. 
    */ 
    @Deprecated void Foo(); 
} 

public interface Derived extends Base { 
    void Foo(); 
} 

當我編譯此代碼我接收Derived編譯器警告:

這可以通過標記爲@DeprecatedBase接口上的方法來實現

[棄用]接口Base中的Foo()已被棄用

奇怪的是,如果我從Base的文檔中刪除@deprecated(但保留@Deprecated),此警告消失。

我得到這個警告是否正確?如果是的話,我該如何解決這個問題?


警告似乎Derived.Foo被 「使用」 通信Base.Foo(其被建議使用)。但Derived.Foo「使用」已棄用的Base.Foo的唯一能力是覆蓋它。這似乎表明,您不允許在派生方法中覆蓋棄用的接口方法。

如果是這樣的話,那麼我應該用@SuppressWarnings("deprecation")來裝飾Derived來壓制警告嗎?

+0

您正在使用哪個版本的Java?我似乎記得,這被認爲是一個錯誤,可能是固定的......但我不能確定我是否正確記住了這一點。我確切地看到你的意思。 – 2009-07-31 16:13:55

回答

9

我相信您的要求是有效的,我毫不懷疑重寫棄用的方法是正確的方法。

我相信@deprecated和@Deprecated之間的區別主要是歷史的。 @Deprecated是java 5中的官方方式,但是是新的,所以我們希望使用@deprecated將其加倍。

另外請注意,可悲的是,@Deprecated不允許您指定信息..通常需要信息,例如告訴應該用什麼作爲替換,或者當不建議使用的方法是完全的除去。

不知道更多,只要你有效地刪除超級方法,知道問題就會消失,我會使用@SuppressWarnings(「deprecation」),可能爲你的後繼者理解......(和對超級方法的另一種評論告訴他們在刪除方法時刪除所有的方法)。;-)

2

如果我理解正確,您需要在類的開始處實現已棄用的接口/函數時使用@SuppressWarnings(「deprecation」)。還是我在這裏基地?

+0

這聽起來很合理,但是這裏的問題是沒有實現類。只是兩個接口。警告似乎表明`Derived.Foo`是「使用」`Base.Foo`(已棄用)。但是`Derived.Foo`使用'Base.Foo`的唯一能力就是覆蓋它。這似乎表明,您不允許在派生方法中覆蓋棄用的接口方法。這是否合理? – 2009-07-31 16:03:26

+0

我不知道「不允許」,但由於您實際上覆蓋了棄用的函數,因此我認爲它會抱怨它。有什麼辦法可以將它們分開,讓它們成爲兩個完全獨立的接口,或者Derived是否必須擴展其他功能? – MattC 2009-07-31 19:54:42

-1

有沒有辦法完成你想要的。

棄用是一種相對簡單的機制,不支持此用例。

不推薦使用的方式是引用已棄用方法或字段的任何內容都會生成警告。

唯一的例外是如果使用不推薦使用的方法/字段的代碼本身已被棄用。

+0

這是正確的反應(而不是抑制警告),因爲您依賴於派生的方法在不推薦使用的API上。 – Mnementh 2009-08-04 14:39:56

3

如果您將@Deprecated添加到您的Foo()派生聲明中,我相信該警告將消失。

public interface Derived extends Base { 
    @Deprecated void Foo(); 
}