我之前曾问过这个问题,但从未找到解决方法。

我试图将一个子类型添加到定义如下的列表中。这应该是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定义方法,但不应使用数据成员定义

07-26 04:04