1:这里为啥会报错,不能这么写吗?
2:
class Animal {}
class Cat extends Animal{}
List<? super Cat> list = new ArrayList<Cat>();
list.add(new Animal());
这里已经限制了list中,只能放Cat以及Cat的超类,而Animal正好是Cat的超类这里为啥会报错?
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
1.不能
2.?superCat是表示尖括号里的类型是Cat的超类,约束是要求List<T>里的T必须是Cat的超类。。。(虽然有点绕,但是你填newArrayList<Animal>()是可以过的,但是下面的add却只能添加Cat及其子类了。)
回复 @西夏一品堂:Java这么设计主要是为了类型安全,对编码直观与否没太多考虑。所以用起来很坑。回复 @西夏一品堂:是啊,很坑,因为List<T>在声明add的时候是用的add(Tt),所以List<?superCat>的时候add就变成了add(?superCat);这个约束了传入的至少是Cat和其子类。既然限制了只能是Cat的超类,为啥又只能addCat的子类呢?这不是坑爹吗?这个super的意思是这里的类是后面的父类,你当然不能作为integer的父类了,后面可以是你的自定义类回复 @西夏一品堂:相反,是后面的子类extends呢?