背景
春ブーツ、コントローラ内のペイロード・オブジェクトへのアクセスを使用する場合は、次に我々は、ペイロードオブジェクトからリストを取得したいです。
// 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点です。
- これは、警告を解決することができます。
- あなたは問題の種類を持っている場合は、異常な例外は物事がうまくいかない原因(デバッグ)を見つけることは容易で未来を促進するために、このラインにスローされます。
まだ学ん著者は、何かが間違っがある場合は、指摘し、含まれている、あなたに感謝してください!
著者:デビッド・チョウ(バンクーバーSFUコンピュータ学生)