对 Java 之泛型通配符 ?extends T 的认知 和 ? super T 一些疑惑

讨论 未结 12 50
rqxiao
rqxiao 会员 2022年6月10日 05:57 发表
收藏(0)  分享
相关标签: 灌水交流
注意:本文归作者所有,未经作者允许,不得转载
12个回复
  • ianEros
    2022年6月10日 05:57
    虽然没看懂问题。。但是我知道的事同一个 list 是可以反射放入任意类,因为会范型擦除,jvm 并不关注里面放了什么
    0 0
  • chendy
    2022年6月10日 06:29
    理解没问题 extends 和 super 其实都不知道具体的类型是什么 extends T 不知道子类是什么,于是不能写入,但是可以用 T 读取 super T 不知道父类是什么,于是不能读(只能用 Object 读),但是可以写入 T ,因为 T 肯定是兼容的类型
    0 0
  • rqxiao
    2022年6月10日 06:29
    List<? super a5> 可以引用 ArrayList ( 或者其它 List 的 子类 ) 的对象,这个对象包含的元素类型是 a5 的父类型 ( 包含 C 本身)的一种。 但是不能添加 a5 分类。 不能添加 a5 分类 原因,其实也可以用这个例子说明? List<a3> a3_List = new ArrayList<a3>(); a3_List .add(new a4()); a3_List .add(new a3()); a3_List .add(new a2());// error 所以最终说 List<? super T> 并不能添加 T 的父类?
    0 0
  • Mistwave
    2022年6月10日 06:29
    都是 type bound 一个协变( covariance ) 一个逆变( contravariance )
    0 0
  • Leviathann
    2022年6月10日 06:29
    协变的容器,元素的子类型关系和容器的子类型关系是相同的 逆变是相反的 这里的容器是指类型容器 而直接的 T 则是不变,容器类型的子类型关系和元素类型无关
    0 0
  • nothingistrue
    2022年6月10日 06:29
    你这个疑问,起始不止跟泛型有关,还跟 Base base = new AnyChild() 多态有关。 如果没有泛型(或者说完美的泛型),应该是这样的多态,List<Fruit> fruits = new ArrayList(); ruits.add(new Apple()); fruits.add(new Banana);。但是 Java 的泛型不是完美的泛型,用得是编译擦除,所以实现不了上面的效果。因为泛型仅存在于编译时,运行时被擦除了,运行时的 fruits 就是个 List<?>,你给他 add 啥都可以。
    0 0
  • bonjourcs
    2022年6月10日 08:30
    可以这样理解,不妨用 a1 > a2 表示 a1 是 a2 父类,在你的描述里,应该有 a1 > a2 > a3 > a4 > a5 。 你定义一个 List<? super a5> 的容器,本质上想有一个“存放 a5 和 a5 父类的容器”,Java 里有:List<? super a1> 是 List<a5> 的子类,这种现象叫做逆变。那么就有: List<? super a5> > List<a5> List<? super a5> > List<a4> ... List<? super a5> > List<a1> 结合上面的定义这个 List<? super a5> 可能是 List<a1>、List<a2>、List<a3>、List<a4>、List<a5> 中的任意一种,编译器不能替你决定到底是哪一个,因此它只允许 List<? super a5> 存入 a5 类型或者 a5 的子类。
    0 0
  • bonjourcs
    2022年6月10日 08:30
    typo: "List<? super a1> 是 List<a5> 的子类" -> "List<? super a5> 是 List<a1> 的父类"。
    0 0
  • unco020511
    2022年6月10日 09:26
    你把?理解为一个确定的类型你就能想明白了.假设 T extends A extends B, 那么 List<? super T> 可以是 List<B>或者 List<A>,如果是 List<A>,你能往里面装 B 的对象吗,并不能,但你绝对可以往里装 T
    0 0
  • GuuJiang
    2022年6月10日 12:27
    这可以算得上是一个月经问题了,和其他另外几个问题一样,属于里面有一个弯转过来了就一切迎刃而解,转不过来就始终似懂非懂
    0 0
  • kaedea
    2022年6月10日 14:26
    无脑记住 PRCS:Producer 用 extends ,Consumer 用 super 。
    0 0
  • Kaiv2
    2022年6月10日 16:58
    这里写代码太费劲了,创建了一个帖子回复
    0 0