5

@Deprecated アノテーションを使用しようとしています。@Deprecated のドキュメントには、「非推奨のプログラム要素が非推奨のコードで使用またはオーバーライドされると、コンパイラは警告する」と記載されています。これがトリガーになるはずだと思いますが、そうではありませんでした。javac バージョン 1.7.0_09 であり、-Xlint および -deprecation を使用して、または使用せずにコンパイルされています。

public class TestAnnotations {

   public static void main(String[] args)
   {
      TestAnnotations theApp = new TestAnnotations();
      theApp.thisIsDeprecated();
   }

   @Deprecated
   public void thisIsDeprecated()
   {
      System.out.println("doing it the old way");
   }
}

編集:メソッドが別のクラスにある場合にのみ機能するという以下のgd1のコメントに従って、2番目のクラスを追加しました。そして、theOldWay() の呼び出しに対して警告を発します。

public class TestAnnotations {

   public static void main(String[] args)
   {
      TestAnnotations theApp = new TestAnnotations();
      theApp.thisIsDeprecated();
      OtherClass thatClass = new OtherClass();
      thatClass.theOldWay();
   }

   @Deprecated
   public void thisIsDeprecated()
   {
      System.out.println("doing it the old way");
   }
}

class OtherClass {

   @Deprecated
   void theOldWay()
   {
      System.out.println("gone out of style");
   }


}

警告:

/home/java/TestAnnotations.java:10: 警告: [非推奨] OtherClass の theOldWay() は非推奨になりました

    thatClass.theOldWay();
             ^

1 件の警告

4

2 に答える 2

5

Java言語仕様から:

Java コンパイラは、宣言に @Deprecated アノテーションが付けられた型、メソッド、フィールド、またはコンストラクタが使用された場合 (つまり、名前でオーバーライド、呼び出し、または参照された場合)、非推奨警告を生成する必要があります。

  • @Deprecated というアノテーションが付けられたエンティティ内で使用されます。また

  • 使用は、アノテーション @SuppressWarnings("deprecation"); で警告を抑制するようにアノテーションが付けられたエンティティ内で行われます。また

  • use と宣言はどちらも同じ最外部クラス内にあります。

あなたの例は、最後の条件の例です。非推奨のメソッドと同じ最も外側のクラスの非推奨のメソッドのみを使用しています。

于 2012-10-28T11:00:05.127 に答える
0

非推奨 常に警告をトリガーするとは限りません。フレームワーク/アプリケーションで非推奨ロジックを管理する必要があります。

1.5 JavaDocから:

注: Java 言語仕様では、@Deprecated アノテーションでマークされたクラス、メソッド、またはフィールドが使用されている場合にコンパイラが警告を発行する必要があります。Java 言語仕様では、@deprecated Javadoc タグでマークされたクラス、メソッド、またはフィールドにアクセスしたときにコンパイラが警告を発行する必要はありませんが、Sun コンパイラは現在そうしています。ただし、Sun コンパイラが常にそのような警告を発行するという保証はありません。

于 2012-10-28T10:55:53.753 に答える