上界通配符导致 Java 中的编译错误

2023-12-03

我不明白为什么会出现这些编译错误:

1:

List 类型中的方法 add(capture#1-of ? extends Exec.Bird) 不适用于参数 (Exec.Sparrow)

2:

List 类型中的方法 add(capture#2-of ? extends Exec.Bird) 不适用于参数 (Exec.Bird)

static class Bird{}
static class Sparrow extends Bird{}

public static void main(String[] args){
    List<? extends Bird> birds = new ArrayList<Bird>();
    birds.add(new Sparrow()); //#1 DOES NOT COMPILE
    birds.add(new Bird());// //#2 DOES NOT COMPILE
}

With List<? extends Bird>你实际上说Bird 子类型的任何类型,或者更准确地说,未知但特定的类型,是以下类型的子类型Bird。这和说的不一样每种扩展类型Bird.

这意味着?可以是一个Sparrow,但它也可以是Blackbird。如果您尝试添加Sparrow到一个列表could仅包含Blackbirds,这是行不通的。出于同样的原因,您不能添加Bird到一个列表could是一个列表Sparrows.

为了使事情正常工作,您只需将列表的声明更改为:

List<Bird> birds = new ArrayList<>();

或使用下界:

List<? super Bird> birds = new ArrayList<>();

关于这个下限示例:声明实际上说任何类型是Bird或其超类之一。这意味着您可以安全地添加Sparrow or a Bird,因为两者都满足这些标准。

一般来说,你应该使用? super ...当您写入列表时,并且? extends ...当您从列表中阅读时。如果您同时进行阅读和写作,则不应使用边界。


这个答案提供有关泛型的非常有用的信息。你绝对应该阅读它。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

上界通配符导致 Java 中的编译错误 的相关文章

随机推荐