[英]Upper bounded wildcards causing compilation error in Java
我不明白为什么我会收到这些编译错误:
1:
类型列表中的 add(capture#1-of ? extends Exec.Bird) 方法不适用于参数 (Exec.Sparrow)
2:
类型列表中的方法 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
}
用List<? extends Bird>
List<? extends Bird>
您实际上说的是属于 Bird 子类型的任何类型,或者更准确地说,是属于Bird
子类型的未知但特定类型。 这与说扩展Bird
每种类型不同。
那是?
意思?
可以是Sparrow
,也可以是Blackbird
。 如果您尝试将Sparrow
添加到只能包含Blackbird
的列表中,它将不起作用。 出于同样的原因,您不能将Bird
添加到可能是Sparrow
列表的列表中。
为了使事情正常工作,您只需将列表的声明更改为:
List<Bird> birds = new ArrayList<>();
或使用下限:
List<? super Bird> birds = new ArrayList<>();
关于这个下限示例:声明实际上是说任何类型是Bird
或其超类之一。 这意味着您可以安全地添加Sparrow
或Bird
,因为两者都符合这些标准。
一般来说,你应该使用? super ...
? super ...
当你写到列表中时,和? extends ...
? extends ...
当您从列表中阅读时。 如果您同时阅读和写作,则不应使用边界。
这个答案提供了关于泛型的非常有用的信息。 你绝对应该阅读它。
您可以像这样实例化birds
列表:
List<Bird> birds = new ArrayList<>();
完整代码:
import java.util.ArrayList;
import java.util.List;
public class Main {
static class Bird{}
static class Sparrow extends Bird{}
public static void main(String[] args) {
List<Bird> birds = new ArrayList<>();
birds.add(new Sparrow());
birds.add(new Bird());
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.