Java - Unchecked Cast Warning 的背景,原因以及解決方法

背景

在使用 Spring Boot 的時候,在 controller 裏獲取一個 payload 對象,接着從 payload 對象裏取得我們想要的 list 。

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

此時,我們想要對 list 裏的對象進行操作。假設我們確定 list 裏所裝載的對象是Bookmark,我們想要對每一個 Bookmark 對象調用 getContent() 方法,那麼我們需要先將類型轉換成 Bookmark (type cast) 纔可以。

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

此時我們會得到一個warning:
Type safety: Unchecked cast

原因分析

之所以會出現這個 warning ,是因爲我們沒有對 List 裏的所有對象逐一進行類型轉換 (type casting) 。如果我們只是直接轉換 List 的類型的話,就會產生類型不安全的潛在風險。

比如說,如果因爲某些錯誤的操作,我們不小心將 Bookmark 之外的對象裝進了 List 裏面。那麼當我們在循環裏對 Bookmark 進行操作時,我們會得到異常 exception 。

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
解決方法

通過創建一個新 List ,接着將舊 List 裏的對象逐一取出,進行類型轉換,再加進新的 List 裏,我們可以順利解決這個問題。

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

這樣做的好處有以下兩點:

  1. 可以解決 warning 。
  2. 如果有類型的問題,異常 exception 會在這一行被拋出,方便將來出問題時容易找到原因 (debug) 。

作者仍在學習中, 如果有什麼錯誤,請各位指出幷包含,謝謝!

作者:David Chou(溫哥華SFU計算機學生)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章