我之前曾问过这个问题,但从未找到解决方法。
我试图将一个子类型添加到定义如下的列表中。这应该是100%合法的,子类型扩展了主要类型。
private List<? extends TopBean> beans;
public List<? extends TopBean> getBeans() {
return beans;
}
我正在尝试这样做:
this.getBeans().add(new SecondaryBean());
SecondaryBean扩展了TopBean(不是直接扩展,而是在某种程度上)。
这让我发疯-错误是
The method add(capture#2-of ? extends TopBean) in the type List<capture#2-of ? extends TopBean> is not applicable for the arguments (SecondaryBean)
如果我将其强制转换为TopBean,则出现相同的错误,只是措辞不同
T
he method add(capture#2-of ? extends TopBean) in the type List<capture#2-of ? extends TopBean> is not applicable for the arguments (TopBean)
我必须在通用TopBeans列表中添加一个子SecondaryBean。在这里做什么?
最佳答案
您不能向以这种方式定义的通配符添加任何非空值。
如果您已定义它
List<? super TopBean>
然后可以添加任何扩展TopBean的内容,但要换个故事-只有TopBean扩展或实现的内容
我不明白为什么首先将列表定义为通配符,将其定义为List似乎可以为您提供所需的一切。有时应使用wikdcards定义方法,但不应使用数据成员定义