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

举报
攻城狮Chova 发表于 2022/05/22 18:18:41 2022/05/22
【摘要】 本篇文章详细介绍了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超类型限定的通配符可以向泛型对象中进行写入
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。