开发者社区 问答 正文

java泛型中super的疑问?报错

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

2:

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

list.add(new Animal());

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

展开
收起
爱吃鱼的程序员 2020-06-08 21:19:45 435 分享 版权
1 条回答
写回答
取消 提交回答
  • https://developer.aliyun.com/profile/5yerqm5bn5yqg?spm=a2c6h.12873639.0.0.6eae304abcjaIB

    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呢?
    2020-06-08 21:20:03
    赞同 展开评论