13

次の簡略化されたインターフェイス継承階層を検討してください。

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

public interface Derived extends Base {
}

FooメソッドをBaseインターフェイスからインターフェイスに移動することを目的としていDerivedます。

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

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

この重大な変更を段階的にBase導入するために、しばらくの間、インターフェイスの後方互換性を維持することが望まれます。

Baseこれは、インターフェイスのメソッドを次のようにマークすることで実現できます@Deprecated

// 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ます。

[非推奨] インターフェース Base の Foo() は非推奨になりました

@deprecated奇妙なことに、ドキュメントからを削除するとBase(ただし、@Deprecated はそのままにしておきます)、この警告は消えます。

この警告が表示されるのは正しいですか? もしそうなら、どうすればこれを回避できますか?


Derived.Foo警告は、 「使用中」であることを伝えているようですBase.Foo(これは非推奨です)。Derived.Fooしかし、非推奨を「使用」している唯一の能力は、それBase.Fooをオーバーライドすることです。派生メソッドで非推奨のインターフェイス メソッドをオーバーライドすることは許可されていないようです。

この場合、警告を抑制するために装飾Derivedする必要がありますか?@SuppressWarnings("deprecation")

4

4 に答える 4

13

あなたの要件は有効だと思います。廃止されたメソッドをオーバーライドすることが正しい方法であることは間違いありません。

@deprecatedと@Deprecatedの違いは、主に歴史的なものだと思います。@Deprecatedはjava5の公式な方法ですが、新しいため、@deprecatedで2倍にすることが期待されています。

また、残念ながら、@ Deprecatedでは情報を指定できません。情報は通常必要ですが、たとえば、何を置換として使用するか、または非推奨のメソッドが完全に削除されると予想される場合などです。

詳細がわからず、スーパーメソッドを効果的に削除するとすぐに問題が解消されることを知っているので、@ SuppressWarnings( "deprecation")を使用します。おそらく、後継者が理解できるようにコメントを付けます...(およびメソッドを削除するときにすべてを削除するように指示するスーパーメソッド)。;-)

于 2009-08-01T15:30:02.133 に答える
3

Foo() の派生宣言に @Deprecated を追加すると、警告が消えると思います。

public interface Derived extends Base {
    @Deprecated void Foo(); 
}
于 2016-02-03T23:23:14.103 に答える
3

私が正しく理解していれば、非推奨のインターフェイス/関数を実装するクラスの先頭に @SuppressWarnings("deprecation") が必要です。それとも私はここの基地から離れていますか?

于 2009-07-31T15:58:08.543 に答える
-1

あなたが望むものを達成する方法はありません。

非推奨は比較的単純なメカニズムであり、この使用例はサポートされていません。

非推奨が機能する方法は、非推奨のメソッドまたはフィールドを参照するものはすべて警告を生成することです。

唯一の例外は、廃止されたメソッド/フィールドを使用するコード自体が廃止された場合です。

于 2009-08-04T14:33:58.533 に答える