Java 将子类添加到列表-方法add(capture#2-of?扩展了TopBean)…不适用于参数(TopBean)
我以前问过这个问题,但从来没有找到解决办法 我正在尝试将子类型添加到定义如下的列表中。这应该是100%合法的,子类型扩展了主类型Java 将子类添加到列表-方法add(capture#2-of?扩展了TopBean)…不适用于参数(TopBean),java,inheritance,Java,Inheritance,我以前问过这个问题,但从来没有找到解决办法 我正在尝试将子类型添加到定义如下的列表中。这应该是100%合法的,子类型扩展了主类型 private List<? extends TopBean> beans; public List<? extends TopBean> getBeans() { return beans; } SecondaryBean扩展了TopBean(不是直接扩展,而是在某种程度上扩展) 这让我发疯——错误是 The method
private List<? extends TopBean> beans;
public List<? extends TopBean> getBeans() {
return beans;
}
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)
类型列表中的add(capture#2-of?extends-TopBean)方法不适用于参数(SecondaryBean)
如果我将它转换为TopBean,同样的错误,只是不同的措辞
类型列表中的add(capture#2-of?extends TopBean)方法不适用于参数(TopBean)
我必须将子SecondaryBean添加到通用TopBean列表中。在这里做什么?您不能将任何非空值添加到以这种方式定义的通配符中 如果你能定义它的话
List<? super TopBean>
List基本上你的声明是错误的。不要在变量声明或返回类型中使用通配符。仅对方法参数使用通配符
private List<TopBean> beans;
public List<TopBean> getBeans() {
return beans;
}
私有列表bean;
公共列表getBeans(){
返豆;
}
除了方法参数之外,在任何地方都不使用通配符可能有很多原因和讨论,但这是我个人的一般规则。它过于简单,但将涵盖Java中泛型的所有实际使用的90%-99%
现在,使用我给出的上述代码,您可以将TopBean添加到列表中,或者添加TopBean的任何子类。我解决了这个问题。在下面的演员阵容中,错误消失了(有一个警告,但我可以接受)
((列表)this.getBeans()).add(新的SecondaryBean());
我保证有一份二手豆的清单,所以这是安全的
private List<TopBean> beans;
public List<TopBean> getBeans() {
return beans;
}
((List<SecondaryBean>)this.getBeans()).add(new SecondaryBean());