ジャワ - 未確認のキャストの警告の背景、原因、および解決策

背景

春ブーツ、コントローラ内のペイロード・オブジェクトへのアクセスを使用する場合は、次に我々は、ペイロードオブジェクトからリストを取得したいです。

// Controller
public ResponseEntity<Object> method(@RequestBody JSONObject payload) {
	List<?> list = payload.get("list");
}

この時点で、我々は、動作中のオブジェクトを一覧表示します。私たちは、オブジェクトリストはブックマークにロードされているかを決定とし、我々は、我々が最初に変換するために、ブックマーク(型キャスト)の種類をすることができます必要がある、各ブックマークのオブジェクトのgetContent()メソッドを呼び出したいです。

List<?> list = payload.get("list");
List<Bookmark> bookmarks = (List<Bookmark>) list; // will get warning
for (Bookmark bookmark : list) {
	bookmark.getContent();
}

:この時点では、警告を取得します
タイプ安全性:未チェックキャスト

原因分析

私たちは一覧にありませんので、この警告の出現の理由、すべてのオブジェクト1人のキャストずつ(型キャスト)。List型の我々だけで直接変換した場合、それは潜在的なリスクの危険な種類を生成します。

例えば、いくつかの間違った操作のためのブックマークもし外のオブジェクトは、我々は誤ってリストの内部に入れます。私たちはループ内でブックマークを操作するときに、我々は例外例外を取得します。

List<?> list = Arrays.asList("1", new Bookmark());
List<Bookmark> bookmarks = (List<Bookmark>) list;
for (Bookmark bookmark : bookmarks) {
    bookmark.getContent();
}
// Exception: String cannot be cast to Bookmark
ソリューション

新しいリストを作成し、その後、新しいリストに追加し、オブジェクトのリスト内の1つの、型変換により、古いものを削除し、我々は正常にこの問題を解決することができます。

List<?> list = payload.get("list");
List<Bookmark> bookmarkList = new ArrayList<>();
for (Object item : list) {
	bookmarkList.add((Bookmark) item);
}
for (Bookmark bookmark : bookmarkList) {
	bookmark.getContent();
}

これの利点は、以下の2点です。

  1. これは、警告を解決することができます。
  2. あなたは問題の種類を持っている場合は、異常な例外は物事がうまくいかない原因(デバッグ)を見つけることは容易で未来を促進するために、このラインにスローされます。

まだ学ん著者は、何かが間違っがある場合は、指摘し、含まれている、あなたに感謝してください!

著者:デビッド・チョウ(バンクーバーSFUコンピュータ学生)

发布了14 篇原创文章 · 获赞 8 · 访问量 2211

おすすめ

転載: blog.csdn.net/vandavidchou/article/details/102545491