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计算机学生)

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

猜你喜欢

转载自blog.csdn.net/vandavidchou/article/details/102545491
今日推荐