何SuppressWarnings("チェック)のJava?
-
13-09-2019 - |
質問
いを通して見たときのコードには、多くの方法を指定のアノテーション:
@SuppressWarnings("unchecked")
これはどういう意味ですか?
解決
時々、Javaのジェネリックは、ちょうどあなたがしたい何をやらせていない、とあなたは効果的に何をやっている、本当にをすることをコンパイラに指示する必要がありますは、実行時には、法的になります。
私は通常、私は一般的なインタフェースをからかってるこの痛みを見つけることが、他の例があまりにもあります。それは<警告を避けるのではなく、それを抑制する方法をうまくしようとしている通常は価値がある( Javaのジェネリックよくある質問/>可能>それが
同じジェネリックよくある質問」とは何かがあるで始まる、このトピックに関するいくつかのセクションがあります「未チェック」の警告」の? - それは、読み取りだけでなく価値がある
他のヒント
このようなキャストとして未確認の一般的な操作(ない例外)、についての警告をコンパイル抑制するためのアノテーションです。それは本質的にプログラマが、彼はすでに、コードの特定のビットをコンパイルするときの認識しているこれらについて通知されることを望んでいなかったことを意味します。
あなたはここに、この特定のアノテーションの詳細を読むことができます
また、Oracleはここに注釈の使用にいくつかのチュートリアルのドキュメントを提供しています:
、彼らはそれを置くとして、
「(ジェネリック標題レッスンに説明する)ジェネリック医薬品の出現の前に書かれた従来のコードとインターフェースするとき 『未チェック』警告が発生する可能性があります。」
で支払う際の手数料を知りた現在のJava型システムのバージョンがおかしいのになった。のものであり JSRの命題 /hacksこの問題を修正するには:タイプトークン スーパータイプのトークン,クラスです。cast().
場合に必要な情報であるこsupression、狭いなどが可能である例えばいてクラス自体もしくは長法です。例:
public List<String> getALegacyListReversed() {
@SuppressWarnings("unchecked") List<String> list =
(List<String>)legacyLibrary.getStringList();
Collections.reverse(list);
return list;
}
SuppressWarning の注釈です注釈付き要素のためのコンパイラの警告を抑制するために使用されます。具体的には、unchecked
カテゴリはオフタイプキャストの結果として生成されたコンパイラの警告を抑制することができる。
単に:それはコンパイラが型の安全性を確保することができないことを示すことにより、警告です。
JPA例えばサービス方法:
@SuppressWarnings("unchecked")
public List<User> findAllUsers(){
Query query = entitymanager.createQuery("SELECT u FROM User u");
return (List<User>)query.getResultList();
}
私はここ(「未チェック」)anotate @SuppressWarningsをdidn'n場合は、、それは私が私のResultListを返すようにしたいラインに問題を持つことになります。
ショートカット型の安全性には意味:それはエラーや警告なしでコンパイルおよび実行時に予期しない場合ClassCastException秒を上げていない場合、プログラムは型安全と考えられている。
。私は http://www.angelikalanger.com/GenericsFAQ/FAQSections/Fundamentals上に構築します.htmlをする
は、Javaでは、ジェネリック型の消去の手段によって実現されます。例えば、以下のコード
List<String> hello = List.of("a", "b");
String example = hello.get(0);
次のようにコンパイルされます。
List hello = List.of("a", "b");
String example = (String) hello.get(0);
そしてList.of
は次のように定義されます。
static <E> List<E> of(E e1, E e2);
どのタイプの消去がなった後ます。
static List of(Object e1, Object e2);
コンパイラは、あなたがこのような何かを書くので、もし、実行時に一般的なタイプのものですわかりません。
Object list = List.of("a", "b");
List<Integer> actualList = (List<Integer>) list;
Java仮想マシンは、プログラムの実行中に、一般的な種類が何であるかわかりませんので、これはコンパイルし、それを検証して実行するには、Java仮想マシン用として、これは、これはそれが確認することができる唯一のことである(タイプをList
にキャストされ)それだけます。
しかし今、この行を追加します。
Integer hello = actualList.get(0);
Javaコンパイラは、暗黙的なキャストを挿入してそしてJVMは、予期しないClassCastException
がスローされます。
java.lang.ClassCastException: java.base/java.lang.String cannot be cast to java.base/java.lang.Integer
unchecked
の警告は、キャストがどこか他の例外をスローするプログラムを引き起こす可能性があり、プログラマに指示します。 @SuppressWarnings("unchecked")
との警告を抑制することは、プログラマはコードが安全であると信じていると、予期しない例外が発生しないことをコンパイラに指示します。
なぜあなたはそれをしたいのでしょうか? Javaの型システムは、すべての可能なタイプの使用パターンを表現するには十分ではありません。時には、あなたはキャストが安全であることを知っているかもしれませんが、Javaはそう言うする方法を提供していません - このような警告を非表示にするプログラマは、実際の警告に焦点を当てることができるように、@SupressWarnings("unchecked")
は、使用することができます。例えば、Optional.empty()
値を格納しない空optionalsの割り当てを回避するシングルトンを返します。
private static final Optional<?> EMPTY = new Optional<>();
public static<T> Optional<T> empty() {
@SuppressWarnings("unchecked")
Optional<T> t = (Optional<T>) EMPTY;
return t;
}
このキャストは予想外のクラスキャスト例外の恐れがないので、空のオプションの中に格納された値を取得することができないよう、安全です。
あなたは、コンパイラの警告を抑制し、あなたが書いたコードは、それに応じて合法であることをジェネリックを伝えることができます。
例:
@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バージョン以前のJDK5、他のミックスの構築と、新しいものがあるポージングぬます。
コンパイラの警告をプログラマで、そのプログラマは、既に知られるあの恐ろしい警告をoffにSuppressWarnings.
コンパイラは型の安全性を確保することができないことを示していることで警告。 用語「未チェック」の警告が誤解を招くおそれがあります。これは、警告がどのような方法でオフになっていることを意味するものではありません。 「未チェック」という用語は、コンパイラとランタイムシステムは、型の安全性を確保するために必要となるすべてのタイプのチェックを実行するのに十分な型情報を持っていないことを意味します。この意味で、特定の操作は、「未チェック」です。
「未チェック」の警告の最も一般的な原因は、生タイプの使用です。オブジェクトが生型変数を介してアクセスされたときに生型がすべての必要な型チェックを実行するのに十分な種類の情報を提供しないので、「未チェック」の警告が発行されます。
(原料の種類と一緒に未チェック警告の)例:
TreeSet set = new TreeSet();
set.add("abc"); // unchecked warning
set.remove("abc");
warning: [unchecked] unchecked call to add(E) as a member of the raw type java.util.TreeSet
set.add("abc");
^
addメソッドが呼び出されると、コンパイラは、コレクションにStringオブジェクトを追加しても安全であるかどうか分かりません。 TreeSetのは、文字列S(またはそのスーパータイプ)を含むコレクションである場合、それは安全であろう。しかし、型情報から、コンパイラが言うことができないTreeSetの生タイプで提供さ。したがって、コールは潜在的に危険であり、「未チェック」の警告が発行されます。
コンパイラがそのターゲットタイプのパラメータ化された型または型パラメータのいずれかであるキャストを見つけたときに「未チェック」の警告も報告されています。
(パラメータ化された型または型変数へのキャストと一緒に未チェック警告の)例:
class Wrapper<T> {
private T wrapped ;
public Wrapper (T arg) {wrapped = arg;}
...
public Wrapper <T> clone() {
Wrapper<T> clon = null;
try {
clon = (Wrapper<T>) super.clone(); // unchecked warning
} catch (CloneNotSupportedException e) {
throw new InternalError();
}
try {
Class<?> clzz = this.wrapped.getClass();
Method meth = clzz.getMethod("clone", new Class[0]);
Object dupl = meth.invoke(this.wrapped, new Object[0]);
clon.wrapped = (T) dupl; // unchecked warning
} catch (Exception e) {}
return clon;
}
}
warning: [unchecked] unchecked cast
found : java.lang.Object
required: Wrapper <T>
clon = ( Wrapper <T>)super.clone();
^
warning: [unchecked] unchecked cast
found : java.lang.Object
required: T
clon. wrapped = (T)dupl;
そのターゲットタイプ(コンクリートまたは有界ワイルドカード)のいずれかであるキャストパラメータ化された型または型パラメータ、実行時にダイナミック型チェックが関係している場合、危険です。実行時には、唯一のタイプの消去は、ソースコードに表示され利用可能ではなく、正確な静的型です。結果として、鋳造のランタイム部分はない正確な静的型に、型消去に基づいて行われます。
の例では、ラッパーへのキャストは、オブジェクトが、それがメンバーの特定のタイプのラッパーであるか否か、ラッパーでsuper.cloneから返されたかどうかをチェックします。同様に、型パラメータTへのキャストは、実行時にオブジェクトの型にキャストされ、そしておそらく完全に離れて最適化されました。消去を入力するために、ランタイム・システムは、実行時に、より有用な型チェックを実行することができません。
それがターゲット・タイプのタイプの消去に対してのみキャストチェックの実際の動的部分ながら、各ターゲット・タイプへのキャストが行われることを示唆しているので、ように、ソースコードは、誤解を招きます。 「未チェック」の警告は、キャストの静的および動的な側面の間のこの不整合のためにプログラマの注意を引くために発行されます。
をご参照ください:<のhref = "http://www.angelikalanger.com/GenericsFAQ/FAQSections/TechnicalDetails.html#What%20is%20an%20unchecked%20warning?" rel = "nofollowをnoreferrer"> "未チェック" の警告は何ですか?の
@SuppressWarningsアノテーションはJDKで利用可能な3つの組み込み注釈の一つとJava 1.5で@Overrideおよび@Deprecatedと一緒に追加されます。
@SuppressWarningsは無視または抑制するためのコンパイラ、注釈付き要素内の指定されたコンパイラの警告とその要素内のすべてのプログラム要素を指示します。 クラスが特定の警告を抑制するために注釈された場合、そのクラス内のメソッドで生成された警告は、また、分離される。
あなたは@SuppressWarnings(「未チェック」)と@SuppressWarnings(「シリアル」)、@SuppressWarnings注釈の中で最も人気のある例のうちの2つを見ているかもしれません。後に警告が直列化可能クラスでSerialVersionUIDをを追加する方法について思い出させるために使用される前者が原因未確認の鋳造に生成される警告を抑制するために使用されます。
続きを読む:<のhref = "https://javarevisited.blogspot.com/2015/09/what-is-suppresswarnings-annotation-in-java-unchecked-raw-serial.html#ixzz5rqQaOLUa" のrel =」 noreferrer nofollowを "> https://javarevisited.blogspot.com/2015/09/what-is-suppresswarnings-annotation-in-java-unchecked-raw-serial.html#ixzz5rqQaOLUa の