百科问答小站 logo
百科问答小站 font logo



Java 泛型 <? super T> 中 super 怎么 理解?与 extends 有何不同? 第1页

  

user avatar   zhao-lao-shi-50-98 网友的相关建议: 
      

省去术语,目的是让读者先明白。

java是单继承,所有继承的类构成一棵树。

假设A和B都在一颗继承树里(否则super,extend这些词没意义)。

A super B 表示A是B的父类或者祖先,在B的上面。

A extend B 表示A是B的子类或者子孙,在B下面。

由于树这个结构上下是不对称的,所以这两种表达区别很大。假设有两个泛型写在了函数定义里,作为函数形参(形参和实参有区别):

1) 参数写成:T<? super B>,对于这个泛型,?代表容器里的元素类型,由于只规定了元素必须是B的超类,导致元素没有明确统一的“根”(除了Object这个必然的根),所以这个泛型你其实无法使用它,对吧,除了把元素强制转成Object。所以,对把参数写成这样形态的函数,你函数体内,只能对这个泛型做插入操作,而无法读

2) 参数写成: T<? extends B>,由于指定了B为所有元素的“根”,你任何时候都可以安全的用B来使用容器里的元素,但是插入有问题,由于供奉B为祖先的子树有很多,不同子树并不兼容,由于实参可能来自于任何一颗子树,所以你的插入很可能破坏函数实参,所以,对这种写法的形参,禁止做插入操作,只做读取


具体请看 《effective java》里,Joshua Bloch提出的PECS原则

java - What is PECS (Producer Extends Consumer Super)?




  

相关话题

  只给:代码和大道理,不给详细Example(或者demo、sample)的教材作者是怎么想的? 
  为什么大部分程序员都喜欢用黑色界面? 
  面向对象中接口应该更抽象还是更具象? 
  程序员如何快速上手一个自己不太熟悉的新项目?有什么技巧? 
  Java 平台中的 JVM 和 .Net 平台下的 CLR 分别是用什么语言写的? 
  为什么时效上具有明显优势的基数排序(radix sort)没有快速排序流行? 
  程序员职业生涯真的很短吗? 
  为什么java返回json时用code=0表示成功, 而我观察的php和nodejs都是用1表示成功? 
  如何反驳“代码混淆只是降低了可读性,安全性并没有得到实质提升”的观点? 
  如何看待千锋教育在全网开源自己的全学科教学视频? 

前一个讨论
为什么梯度下降能找到最小值?
下一个讨论
2016年,你读过的最好的IT技术书有哪几本?





© 2025-05-29 - tinynew.org. All Rights Reserved.
© 2025-05-29 - tinynew.org. 保留所有权利