`
shifulong
  • 浏览: 59201 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

java泛型中的PECS

    博客分类:
  • java
阅读更多

extends

List<? extends Number>

 

下面这三种通配符声明都是合法的

List<? extends Number> foo3 = new ArrayList<Number>();  // Number "extends" Number (in this context)
List<? extends Number> foo3 = new ArrayList<Integer>(); // Integer extends Number
List<? extends Number> foo3 = new ArrayList<Double>();  // Double extends Number

Reading

  • 能从foo3中读一个Number
  • 不能从foo3中读一个Integer
  • 不能从foo3中读一个Double 

Writing

  • 不能添加Number到foo3
  • 不能添加Integer到foo3
  • 不能添加Double到foo3 

因为foo3可以指向任意Number的子类型list,只能保证从foo3中读出的是Number,不能确定foo3指向的是一个什么类型,所以add任意类型都会报错

 

 

super

List <? super T >

下面这三种通配符声明都是合法的

List<? super Integer> foo3 = new ArrayList<Integer>();  // Integer is a "superclass" of Integer (in this context)
List<? super Integer> foo3 = new ArrayList<Number>();   // Number is a superclass of Integer
List<? super Integer> foo3 = new ArrayList<Object>();   // Object is a superclass of Integer

Reading

  • 不能确定读出的是一个Integer,因为有可能指向List<Number> or List<Object>
  • 不能确定读出的是一个Number,因为有可能指向List<Object>
  • 只能读出Object,但无法确定这个Object是什么类型

Writing

  • 能add  Integer,
  • 能add  Integer的子类型
  • 不能add Double
  • 不能add Number
  • 不能add Object

 

总结

  1. 如果你想从一个数据类型里获取数据(List#get()),使用 ? extends 通配符
  2. 如果你想把对象写入一个数据结构里(LIst#add()),使用 ? super 通配符
  3. 如果你既想存,又想取,那就别用通配符。

 

举个栗子

public static <T> void copy(List<? extends T> src, List<? super T> dest) {
    for (int i = 0; i < src.size(); i++) {
        dest.add(i, src.get(i));
    }
}

 

英文wiki

http://stackoverflow.com/questions/4343202/difference-between-super-t-and-extends-t-in-java

分享到:
评论

相关推荐

    简单粗暴一文彻底搞懂Java泛型中的PECS原则(在坑里躺了多年终于爬出来了).md

    Java泛型中的PECS原则是程序员在处理带有泛型的集合时需要遵循的一条编程指导原则,它是英文单词Producer-Extends, Consumer-Super的缩写。PECS原则来自于《Effective Java》一书中提到的一条原则,即“Get and put ...

    Java泛型

    总之,Java泛型通过引入类型参数,增强了代码的类型安全,简化了类型转换,并提高了代码的重用性。理解和熟练运用泛型是成为专业Java开发者的必备技能。在实际编程中,应充分利用泛型来编写更加健壮和可维护的代码。

    java泛型源码-Java-Generics-Tutorial:教程的源代码

    java泛型源码Java泛型用法 步骤1 原始类型有问题。 第2步 使用泛型类型。 第三步 车库和车辆。 原始类型。 第四步 首先尝试生成车库。 木星在我的车库里。 第5步 泛型上限。 第6步 TripleGarage 步骤7 试图使用泛型...

    java基础泛型 学习全文件

    Java基础泛型是Java编程语言中的一个重要特性,它允许在类、接口和方法中使用类型参数,从而增强了代码的类型安全性和重用性。在Java中,泛型的主要目标是提高效率,避免运行时的类型转换,并且在编译时期就能发现...

    泛型中extends和super的区别Java系列2021.pdf

    在Java泛型编程中,extends和super关键字用于限制类型参数的范围。PECS原则是一个重要的原则,用于指导泛型编程。了解extends和super关键字的区别,并遵循PECS原则,可以帮助你编写更好的泛型代码。

    存取原则和PECS法则

    在Java编程中,泛型是一种强大的工具,它允许我们在编译时就确保代码的安全性和类型正确性。在处理泛型时,"存取原则"和"PECS法则"是非常重要的概念,它们指导我们如何正确使用" ? extends"和" ? super"通配符。 ...

    Java Generics Cheatsheet

    Java泛型是Java编程语言中的一个重要特性,它允许在编译时提供类型的安全性检查,减少类型转换的需要,并允许程序员在创建集合和其他类型的数据结构时不用指定具体的类型。泛型能够支持类型之间的继承关系,增强代码...

    泛型&通配符常见面试题总结

    泛型和通配符是Java编程中的重要概念,它们在处理类型安全和代码复用方面起着关键作用。本文将深入探讨这两个主题,并提供一些常见的面试题,帮助开发者理解和掌握这些知识点。 首先,我们来理解泛型。泛型是Java 5...

    K_Generic--Bounds Wildcards知乎回答1

    在Java泛型中,通配符(Wildcards)和边界(Bounds)是为了解决类型兼容性和灵活性的问题。通配符允许我们定义泛型类型的限制,而边界则指定了这些限制的具体范围。 1. 为什么要使用通配符和边界? 在Java中,泛型...

    通配符泛型

    通配符泛型是Java编程语言中...总的来说,通配符泛型是Java泛型系统的一个强大工具,它允许我们在保持类型安全的同时,实现更加灵活和广泛的代码重用。理解和熟练掌握通配符泛型的使用,对于提升Java编程能力至关重要。

    阿里开发规范(集合与并发处理)

    ### 阿里Java开发规范——...以上内容总结了阿里巴巴 Java 开发规范中关于集合处理的一些强制规定和推荐做法,旨在帮助开发者更好地理解和应用集合相关的最佳实践,避免常见的错误和异常,提高代码质量和系统的稳定性。

Global site tag (gtag.js) - Google Analytics