Java下限通配符

前端之家收集整理的这篇文章主要介绍了Java下限通配符前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在努力解决这个问题,并且想知道是否有人可以解释这个原因

我有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>)调用您的方法.将天使添加到这样的列表中可以吗?当然不.

了解上下限的要点是,这与我们习惯的常规类型规范有根本的不同.名单&LT ;?超人>是没有确定的类型:它是允许作为参数的一系列类型的模式.当你说人p,那么p将永远是一个人,因为一个员工是一个人.另一方面,列表< Person>不是列表<?超级人物>,它是一种匹配此模式而不是其子类型的类型.

猜你在找的Java相关文章