Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/310.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 是<;?扩展…>;方法参数的排他性?_Java - Fatal编程技术网

Java 是<;?扩展…>;方法参数的排他性?

Java 是<;?扩展…>;方法参数的排他性?,java,Java,假设我有两个类A和B,它们扩展了A。使用以下方法,我可以打印集合的a或扩展a的内容: private static void print(Collection<? extends A> collection) { for (A element : collection) { System.out.println(element); } } 但不是这个 l3.add(new A()); l3.add(new B()); 我确实理解为什么我不能在l

假设我有两个类
A
B
,它们扩展了
A
。使用以下方法,我可以打印
集合
a
或扩展
a
的内容:

private static void print(Collection<? extends A> collection) {

    for (A element : collection) {
        System.out.println(element);
    }

}
但不是这个

l3.add(new A());
l3.add(new B());
我确实理解为什么我不能在
l3
中添加
A
B
的实例。但为什么第一个看似无用的声明被授权

编辑

我用另一个词提问,因为我认为我的问题被误解了


如何处理我的空列表
list答案在
泛型中,直到运行时才知道
A
B
的类型。所以Java不能实例化它们


有关更多信息,请阅读

列表泛型不是协变的,而“?扩展A”不是A。因此您不能执行以下操作:

List<? extends A> l = new ArrayList<>();
l.add(new A());
List<B> l = new ArrayList<>();
l.add(new A());

List它甚至可能是
List
,其中
C
是扩展
A
的另一个类。因此
add(new B())
也是不安全的。所以写
list没有任何意义,因为它是可用的。你不能再增加了,我知道我做不到。我的问题是为什么我可以写
列表
List<? extends A> l = new ArrayList<>();
l.add(new A());
List<B> l = new ArrayList<>();
l.add(new A());
List<String> l = new ArrayList<>();
l.add(new Object());