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