477

コードを調べていると、多くのメソッドが注釈を指定していることがわかります。

@SuppressWarnings("unchecked")

これは何を意味するのでしょうか?

4

11 に答える 11

449

Javaジェネリックでは、やりたいことを実行できない場合があり、実行時に実際に行っていることが合法であることをコンパイラーに効果的に伝える必要があります。

一般的なインターフェースをモックしている場合、これは通常面倒ですが、他の例もあります。通常、警告を抑制するのではなく回避する方法を考え出すことは価値があります (ここではJava Generics FAQが役に立ちます) 。その場合は必ず説明コメントを追加してください。

同じジェネリック FAQ には、このトピックに関するセクションがいくつかあります。「「チェックされていない」警告とは何ですか?」――一読の価値ありです。

于 2009-07-15T06:54:59.450 に答える
50

キャストなど、チェックされていない一般的な操作 (例外ではない) に関するコンパイル警告を抑制するための注釈です。これは基本的に、プログラマーが特定のコードをコンパイルするときに既に認識しているこれらについて通知されることを望まなかったことを意味します。

この特定の注釈の詳細については、次を参照してください。

警告の抑制

さらに、オラクルは、注釈の使用法に関するいくつかのチュートリアル ドキュメントをここで提供しています。

注釈

彼らが言うように、

「「チェックされていない」警告は、ジェネリックが登場する前に書かれたレガシーコードとやり取りするときに発生する可能性があります(ジェネリックというタイトルのレッスンで説明されています)。

于 2009-07-15T06:53:31.310 に答える
22

また、現在の Java 型システムのバージョンがあなたのケースに十分ではないことを意味している可能性もあります。これを修正するためのいくつかのJSR 提案/ハックがありました: タイプ トークン、スーパー タイプ トークン、 Class.cast()。

この抑制が本当に必要な場合は、できる限り絞り込んでください (たとえば、クラス自体や長いメソッドには含めないでください)。例:

public List<String> getALegacyListReversed() {
   @SuppressWarnings("unchecked") List<String> list =
       (List<String>)legacyLibrary.getStringList();

   Collections.reverse(list);
   return list;
}
于 2009-07-15T07:44:01.707 に答える
11

SuppressWarning注釈は、注釈付き要素のコンパイラ警告を抑制するために使用されます。具体的には、このuncheckedカテゴリでは、チェックされていない型キャストの結果として生成されるコンパイラの警告を抑制することができます。

于 2009-07-15T07:02:32.120 に答える
6

コンパイラの警告を抑制し、ジェネリックに、記述したコードが正当であることを伝えることができます。

例:

@SuppressWarnings("unchecked")
public List<ReservationMealPlan> retreiveMealPlan() {
     List<ReservationMealPlan> list=new ArrayList<ReservationMealPlan>();
    TestMenuService testMenuService=new TestMenuService(em, this.selectedInstance);
    list = testMenuService.getMeal(reservationMealPlan);
    return list;
 }
于 2010-09-09T05:08:44.807 に答える
5

1 つの秘訣は、汎用の基本インターフェイスを拡張するインターフェイスを作成することです...

public interface LoadFutures extends Map<UUID, Future<LoadResult>> {}

次に、キャストの前に instanceof で確認できます...

Object obj = context.getAttribute(FUTURES);
if (!(obj instanceof LoadFutures)) {
    String format = "Servlet context attribute \"%s\" is not of type "
            + "LoadFutures. Its type is %s.";
    String msg = String.format(format, FUTURES, obj.getClass());
    throw new RuntimeException(msg);
}
return (LoadFutures) obj;
于 2010-09-17T21:52:09.967 に答える
4

私の知る限り、今のところ、ジェネリックに関する警告を抑制することに関係しています。ジェネリックは、JDK 5 より前のバージョンの JDK ではサポートされていない新しいプログラミング構造であるため、古い構造と新しい構造を混在させると、予期しない結果が生じる可能性があります。

コンパイラはそれについてプログラマーに警告しますが、プログラマーが既に知っている場合は、SuppressWarnings を使用してこれらの恐ろしい警告を無効にすることができます。

于 2009-07-15T07:03:15.270 に答える