java泛型中super的疑问

西夏一品堂 发布于 2016/10/15 13:14
阅读 241
收藏 0

1:这里为啥会报错,不能这么写吗?

2:

class Animal {}
class Cat extends Animal{}
List<? super Cat> list = new ArrayList<Cat>();

list.add(new Animal());

这里已经限制了list中,只能放Cat以及Cat的超类,而Animal正好是Cat的超类这里为啥会报错?

加载中
0
大止刀口
大止刀口

1.不能

2.? super Cat是表示尖括号里的类型是Cat的超类,约束是要求List<T>里的T必须是Cat的超类。。。(虽然有点绕,但是你填new ArrayList<Animal>()是可以过的,但是下面的add却只能添加Cat及其子类了。)

大止刀口
大止刀口
回复 @西夏一品堂 : Java这么设计主要是为了类型安全,对编码直观与否没太多考虑。所以用起来很坑。
大止刀口
大止刀口
回复 @西夏一品堂 : 是啊,很坑,因为List<T>在声明add的时候是用的add(T t),所以List<? super Cat>的时候add就变成了add(? super Cat);这个约束了传入的至少是Cat和其子类。
西夏一品堂
西夏一品堂
既然限制了只能是Cat的超类,为啥又只能addCat的子类呢?这不是坑爹吗?
0
pantrick
pantrick
这个super的意思是这里的类是后面的父类,你当然不能作为integer的父类了,后面可以是你的自定义类
pantrick
pantrick
回复 @西夏一品堂 : 相反,是后面的子类
西夏一品堂
西夏一品堂
extends呢?
返回顶部
顶部