我正在努力解决这个问题,并且想知道是否有人可以解释这个原因
我有3班职员,人,天使
员工延伸人与人延伸天使
当我尝试这样做的代码:
public static void insertElements(List<? super Person> list){ list.add(new Person("Mike",42)); list.add(new Employee()); list.add(new Angel()); }
我收到一个错误
The method add(capture#5-of ? super Person) in the type List is not applicable for the arguments (Angel)
我一直在阅读文档,意思是指X或X的超类(所以在我的情况下,Angel是Person的超类),应该被允许?很明显不是!
有谁有任何好的例子,这将点击我的大脑?
非常感谢
麦克风
解决方法
你的直观逻辑说:“一个列表<?超级人物>是一个Person或者一个Person的超类型的事物列表,所以我自然可以添加一个天使.这种解释是错误的.
声明列表<?超人>列表保证列表将是允许任何一个Person被添加到列表的类型.由于天使不是一个人,编译器当然不允许这样做.考虑使用insertElements(新的ArrayList< Person>)调用您的方法.将天使添加到这样的列表中可以吗?当然不.
了解上下限的要点是,这与我们习惯的常规类型规范有根本的不同.名单< ;?超人>是没有确定的类型:它是允许作为参数的一系列类型的模式.当你说人p,那么p将永远是一个人,因为一个员工是一个人.另一方面,列表< Person>不是列表<?超级人物>,它是一种匹配此模式而不是其子类型的类型.