コードを調べていると、多くのメソッドが注釈を指定していることがわかります。
@SuppressWarnings("unchecked")
これは何を意味するのでしょうか?
コードを調べていると、多くのメソッドが注釈を指定していることがわかります。
@SuppressWarnings("unchecked")
これは何を意味するのでしょうか?
Javaジェネリックでは、やりたいことを実行できない場合があり、実行時に実際に行っていることが合法であることをコンパイラーに効果的に伝える必要があります。
一般的なインターフェースをモックしている場合、これは通常面倒ですが、他の例もあります。通常、警告を抑制するのではなく回避する方法を考え出すことは価値があります (ここではJava Generics FAQが役に立ちます) 。その場合は必ず説明コメントを追加してください。
同じジェネリック FAQ には、このトピックに関するセクションがいくつかあります。「「チェックされていない」警告とは何ですか?」――一読の価値ありです。
キャストなど、チェックされていない一般的な操作 (例外ではない) に関するコンパイル警告を抑制するための注釈です。これは基本的に、プログラマーが特定のコードをコンパイルするときに既に認識しているこれらについて通知されることを望まなかったことを意味します。
この特定の注釈の詳細については、次を参照してください。
さらに、オラクルは、注釈の使用法に関するいくつかのチュートリアル ドキュメントをここで提供しています。
彼らが言うように、
「「チェックされていない」警告は、ジェネリックが登場する前に書かれたレガシーコードとやり取りするときに発生する可能性があります(ジェネリックというタイトルのレッスンで説明されています)。
また、現在の Java 型システムのバージョンがあなたのケースに十分ではないことを意味している可能性もあります。これを修正するためのいくつかのJSR 提案/ハックがありました: タイプ トークン、スーパー タイプ トークン、 Class.cast()。
この抑制が本当に必要な場合は、できる限り絞り込んでください (たとえば、クラス自体や長いメソッドには含めないでください)。例:
public List<String> getALegacyListReversed() {
@SuppressWarnings("unchecked") List<String> list =
(List<String>)legacyLibrary.getStringList();
Collections.reverse(list);
return list;
}
SuppressWarning注釈は、注釈付き要素のコンパイラ警告を抑制するために使用されます。具体的には、このunchecked
カテゴリでは、チェックされていない型キャストの結果として生成されるコンパイラの警告を抑制することができます。
コンパイラの警告を抑制し、ジェネリックに、記述したコードが正当であることを伝えることができます。
例:
@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;
}
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;
私の知る限り、今のところ、ジェネリックに関する警告を抑制することに関係しています。ジェネリックは、JDK 5 より前のバージョンの JDK ではサポートされていない新しいプログラミング構造であるため、古い構造と新しい構造を混在させると、予期しない結果が生じる可能性があります。
コンパイラはそれについてプログラマーに警告しますが、プログラマーが既に知っている場合は、SuppressWarnings を使用してこれらの恐ろしい警告を無効にすることができます。