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

本文探讨了在SpringBoot框架下,如何安全地从payload中获取并转换List内的Bookmark对象,避免类型安全警告及运行时异常。介绍了正确类型转换的方法,并强调了其对于调试和维护的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

背景

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

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值