终于搞懂了泛型 extends T>与 super T>

终于搞明白了 extends T>与 super T>的区别,网上很多文章说的都是错误的,下面讲下我的理解。

List、List、List>

List :完全没有类型限制和赋值限定。List :看似用法与List一样,但是在接受其他泛型赋值时会出现编译错误。List>:是一个泛型,在没有赋值前,表示可以接受任何类型的集合赋值,但赋值之后不能往里面随便添加元素,但可以remove和clear,并非immutable(不可变)集合。List>一般作为参数来接收外部集合,或者返回一个具体元素类型的集合,也称为通配符集合。代码验证:

终于搞懂了泛型 <div class=
与" class="syl-page-img">

终于搞懂了泛型 <div class=
与" class="syl-page-img">


extends T>与 super T>

List 最大的问题是只能放置一种类型,为了放置多种受泛型约束的类型,出现了 extends T>与 super T> 两种语法。简单来说, extends T> 是Get First,适用于取出集合元素消费的场景; super T>是Put First,适用于生产集合元素为主的场景。

super T> : 里面放的是T或T的子类元素,注意理解, super T>是给集合设置了一个界限,不能往里放T以上的类型,但是可以安全的插入T或T子类。因为有上界,可以安全的插入上界类型的子类。但是读取出来时,因为无法确定具体是什么子类型,所以只能统一转为上届类型,泛型丢失。


extends T> :里面放的也是T或T的子类。那可能你会疑惑,这又什么区别呢?, extends T> 一般是用作方法的入参,用来限制传进来的参数必须只能是某个T类或其子类,这样我的方法可以统一向上强制转型为T进行处理。任何元素都不得添加进 extends T>集合内。记住 extends T>不能add元素进去。因为我们并不知道传进来的是什么具体的子类。


代码示例如下,以加菲猫、猫、动物为例,说明extends和super的详细语法差异


终于搞懂了泛型<? extends T>与<? super T>

终于搞懂了泛型 <div class=
与" class="syl-page-img">

终于搞懂了泛型<? extends T>与<? super T>


总之, extends T>的场景是put功能受限,可以读取元素,一般用来接收参数。

而 super T>是可以插入元素。


源码放上:在公-众-号:技术笔记与开源分享



分享到:

關鍵字: 赋值 元素 搞懂


相關文章: