前言:
现在看官们对“泛型”大致比较重视,咱们都需要分析一些“泛型”的相关资讯。那么小编也在网摘上收集了一些有关“泛型””的相关内容,希望你们能喜欢,兄弟们一起来学习一下吧!终于搞明白了<? extends T>与<? super T>的区别,网上很多文章说的都是错误的,下面讲下我的理解。
List、List<Object>、List<?>
List :完全没有类型限制和赋值限定。List<Object> :看似用法与List一样,但是在接受其他泛型赋值时会出现编译错误。List<?>:是一个泛型,在没有赋值前,表示可以接受任何类型的集合赋值,但赋值之后不能往里面随便添加元素,但可以remove和clear,并非immutable(不可变)集合。List<?>一般作为参数来接收外部集合,或者返回一个具体元素类型的集合,也称为通配符集合。代码验证:
<? 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>的场景是put功能受限,可以读取元素,一般用来接收参数。
而<? super T>是可以插入元素。
源码放上:在公-众-号:技术笔记与开源分享
标签: #泛型