加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

Java下限通配符

发布时间:2020-12-14 05:54:53 所属栏目:Java 来源:网络整理
导读:我正在努力解决这个问题,并且想知道是否有人可以解释这个原因 我有3班职员,人,天使 员工延伸人与人延伸天使 当我尝试这样做的代码: public static void insertElements(List? super Person list){ list.add(new Person("Mike",42)); list.add(new Employee(
我正在努力解决这个问题,并且想知道是否有人可以解释这个原因

我有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>不是列表<?超级人物>,它是一种匹配此模式而不是其子类型的类型.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读