java - 子类的重写 getter 中的向下转换列表返回类型
问题描述
我有以下类层次结构:
public class U {};
public class IU extends U {};
public class A {
private final List<? extends U> us;
public A(Collection<? extends U> us) {
this.us = new ArrayList<>(us);
}
public List<? extends U> getUs() { return this.us; }
}
public class B extends A {
public B(Collection<IU> ius) { super(ius); }
@Override
public List<IU> getUs() { return (List<IU>) super.getUs(); }
}
列表永远不会被构造修改,A.us
我知道getUs()
from只会在从类型对象调用时A
返回List
包含(除非有人做了一些非常混乱的事情,我在这里并不真正打扰)。IU
B
演员B.getUs
被标记为不安全,所以我的问题是:
- 这个演员阵容真的安全还是有一些我没有看到的问题?
- 如果是这样,我如何将其标记为这样以删除警告?
解决方案
由于A
是一个类型容器,因此包含的类型对于每个A
(最终)定义都应该是显式的。
然后,只需更改:
public class U {};
public class IU extends U {};
public class A<T extends U> {
private final List<T> us;
public A(Collection<T> us) {
this.us = new ArrayList<>(us);
}
public List<T> getUs() { return this.us; }
}
public class B extends A<IU> {
public B(Collection<IU> ius) { super(ius); }
@Override
public List<IU> getUs() { return super.getUs(); }
}
现在,A
适用于您想要的每种类型,并且在编译时强制执行正确的类型(没有警告)。
推荐阅读
- rust - 在循环内访问向量的元素时遇到问题
- javascript - Chart.js - 缩小图例以适应数据
- reactjs - 在 ReactJS 中,当您在表单组件中选择某些内容时,如何更改所有项目的边框颜色?
- python - 用于列中具有特定值的行计数的新数据框列,具有相同的客户 ID 列且小于日期和时间
- excel - Tableau 正在添加多次出现的数字。我怎样才能解决这个问题?
- azure - 在天蓝色中设置 showPii
- c - 如何检查字符串中是否存在至少三个数字?
- r - 基于两列创建年龄变量
- vb.net - 用 100 个结果对 10 个值进行线性插值的最简单方法
- swift - Swift SpriteKit SKSpriteNode 移动