Java子类重写getter时向下转型List返回值的安全问题与消警方案
问题1:强制转换的安全性和隐患
在你给出的前提约束下(A的us列表不会被修改、B实例化时传入的集合全为IU类型、不考虑反射等恶意篡改场景),这个强制转换实际是安全的。
唯一的隐患来自后续代码维护层面:
- 如果后续修改A类的实现,新增了修改
us列表的方法,允许加入非IU类型的U子类实例,那么B类的强转就会出现运行时类型错误 - 如果后续修改B类的构造方法,放宽入参限制允许传入其他U子类的集合,也会破坏强转的安全性
这些隐患都不是当前代码逻辑自带的,只要后续维护遵守现有约定就不会触发。
问题2:消除编译警告的方法
直接在B类重写的getUs方法上添加@SuppressWarnings("unchecked")注解即可,建议同时添加注释说明强转安全的原因,方便后续维护人员理解:
@Override @SuppressWarnings("unchecked") // 构造时传入的全是IU实例,us列表不会被修改,强转安全 public List<IU> getUs() { return (List<IU>) super.getUs(); }
内容的提问来源于stack exchange,提问作者Holt
相关产品推荐
相关产品推荐

