Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将子类添加到列表-方法add(capture#2-of?扩展了TopBean)…不适用于参数(TopBean)_Java_Inheritance - Fatal编程技术网

Java 将子类添加到列表-方法add(capture#2-of?扩展了TopBean)…不适用于参数(TopBean)

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

我以前问过这个问题,但从来没有找到解决办法

我正在尝试将子类型添加到定义如下的列表中。这应该是100%合法的,子类型扩展了主类型

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());