Java中的泛型通配符详解!extends和super的使用分析-阿里云开发者社区

开发者社区> 攻城狮Chova> 正文

Java中的泛型通配符详解!extends和super的使用分析

简介: 本篇文章详细介绍了Java中的泛型通配符类型。分别说明了类型的上界extends和类型的下界super,分析了extends和super的基本使用方式以及使用注意点。最后介绍了在使用通配符中需要遵循的PECS原则。
+关注继续查看

? 通配符类型

  • ? extends T表示类型的上界:

    • 表示参数化类型的可以是T或者T的子类
  • ? super T表示类型的下界:

    • 表示参数化类型是这个类型的超类型,即父类型,直至Object

? extends T

  • 上界? extends T只能往外取,不能往里存
  • 通配符 ? 和类型参数 T 的区别:

    • 对于编译器来说,所有的T都代表同一种类型
    • 通配符?没有这样的约束,只表示放置了一个类型,具体是什么类型不能确定
  • ? extends T的作用:

    • 在List中不能使用add方法
    • 可以在初始化时,指定不同的类型
    • 这样就能读取出不同类型的数据

? super T

  • ? super T可以往里存数据,往外取数据只能放在Object对象中
  • ? super T只能添加T类型和T类型的子类,不能添加T类型的父类,读取出来的东西只能存放在Object类里

    • 下界规定了元素的最小粒度的下限,放宽了容器元素的类型控制
    • 因为元素是T的基类,所以往里存比T 小的都可以
    • 出于类型安全的考虑,可以往里加入T类的对象或者T类的任何子类的对象
  • 由于编译器并不知道集合的内容源自T的哪一个超类,所以不允许加入特定的任何超类对象
  • 在读取时,编译器不知道是什么类型的情况下,只能返回Object对象

    • 因为Object是任何Java类的最终父类
    • 这时,元素的类型信息全部丢失

PECS原则

  • PECS原则: Producer Extends Consumer Super

    • 频繁往外读取内容的,适合使用上界Extends
    • 经常往里插入内容的,适合使用下界Super

总结

  • extends可以用于返回类型限定
  • super可以用于参数类型限定,不能用于返回类型限定
  • ? 既不能用于方法参数传入,也不能用于方法返回

  • 带有extends子类型限定的通配符可以向泛型对象进行读取
  • 带有super超类型限定的通配符可以向泛型对象中进行写入

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
Ext架构分析(5)--Layout初识:ContainerLayout
如果学习了Container,你回发现,在Ext2.0中,Container和Layout的关系是密不可分的。任何Container都需要在render方法中使用layout对象进行布局。  让我们先看一下所有layout的父类:ContainerLayout。
633 0
使用Chrome开发者工具分析JavaScript garbage collector(垃圾回收器)的实现原理
使用Chrome开发者工具分析JavaScript garbage collector(垃圾回收器)的实现原理
6 0
Kotlin里的Extension Functions实现原理分析
## Kotlin里的Extension Functions Kotlin里有所谓的扩展函数(Extension Functions),支持给现有的java类增加函数。 * https://kotlinlang.org/docs/reference/extensions.html 比如给`String`增加一个`hello`函数,可以这样子写: ```java
1160 0
分析Java的类加载器与ClassLoader(二):classpath与查找类字节码的顺序,分析ExtClassLoader与AppClassLoader的源码
先回顾一下classpath classpath的作用:         classpath的作用是指定查找类的路径:当使用java命令执行一个类(类中的main方法)时,会从classpath中进行查找这个类。
1109 0
使用分析函数进行行列转换
其实使用分析函数进行处理是很好的方式,翻一下Tom的书,将其中的一个例子收录在这里. 比如查询scott.emp表的用户SAL排序信息,可以使用如下查询: SQL> SELECT deptno, ename, 2 ROW_NUMBER () OVER (PARTITION BY ...
628 0
【原】oracle11G AWR使用及分析
作者:david_zhang@sh 【转载时请以超链接形式标明文章】 链接:http://www.cnblogs.com/david-zhang-index/archive/2012/08/21/2649252.
1001 0
《ExtJS 3详解与实践》阅读补充资料:Ext.extend()中使用super关键字
  既然一门语言被精简了,无论idea还是直观的语法,都务求精简的话,那么这便无形就是一个趋势,趋势往往不为人们的意志转移地转为自己的习惯,思维定性的习惯,连function这个关键字也有某仁兄觉得太长了,有缩减的必要。
730 0
+关注
攻城狮Chova
一位有自我修养的攻城狮。 2006年《时代》周刊年度人物, 2008年感动中国组委会特别奖获得者。 专注分享技术干货,面试经验和攻城狮故事~ 欢迎点赞关注支持,是我持续进步的动力!
77
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载