问题描述
我正在努力解决这个问题,并且想知道是否有人可以解释这个原因.
I'm struggling to get my head around this and was wondering if someone could explain the reasons for this.
我有三节课:
class Angel {}
class Person extends Angel {}
class Employee extends Person {}
当我尝试执行此代码时
public static void insertElements(List<? super Person> list){
list.add(new Person());
list.add(new Employee());
list.add(new Angel());
}
我得到一个错误:
The method add(capture#5-of ? super Person) in the type List<capture#5-of ? super Person> is not applicable for the arguments (Angel)
我总是阅读文档以表示< ;?super X>
表示任何类型的X或X的超类(因此,在我的情况下,Angel是Person的超类),应该允许吗?显然不是!
I had always read the documentation to mean <? super X >
meant any type of X or a superclass of X (so in my case, Angel is a superclass of Person) and should be permitted? Obviously not!
有人有任何简单的例子吗?
Does anyone have any simple examples?
推荐答案
您的直观逻辑说:" List< ;?超级人物>
是事物列表,这些事物是Person
或 Person
的超型,因此自然可以在其中添加 Angel
."这种解释是错误的.
Your intuitive logic says "a List<? super Person>
is a list of things that are a Person
or a supertype of Person
, so naturally I can add an Angel
into it". That interpretation is wrong.
声明 List< ;?超级人物list
保证 list
的类型允许将任何 Person
的内容添加到列表中.由于 Angel
不是 Person
,因此编译器自然不允许这样做.考虑使用 insertElements(new ArrayList< Person>)
调用您的方法.将 Angel
添加到这样的列表中可以吗?绝对不是.
The declaration List<? super Person> list
guarantees that list
will be of such a type that allows anything that is a Person
to be added to the list. Since Angel
is not a Person
, this is naturally not allowed by the compiler. Consider calling your method with insertElements(new ArrayList<Person>)
. Would it be okay to add an Angel
into such a list? Definitely not.
最好的推理方法是 List< ;?super Person>
没有确定的类型:它是一个 pattern ,它描述了允许作为参数的一系列类型.将 List< Person>
视为不是 List<的子类型?超级Person>
,但类型与此模式匹配. List< ;?上允许的操作?超级Person>
是任何匹配类型都允许的.
The best way to reason about it is that List<? super Person>
is no definite type: it is a pattern describing a range of types that are allowed as an argument. Look at List<Person>
as not a subtype of List<? super Person>
, but a type that matches this pattern. The operations allowed on List<? super Person>
are those that are allowed on any matching type.
这篇关于Java下限通配符的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!