`
wangyanlong0107
  • 浏览: 499592 次
  • 性别: Icon_minigender_1
  • 来自: 沈阳
社区版块
存档分类
最新评论

【转】JAVA泛型通配符(PECS)

 
阅读更多

在JAVA的泛型集合中,默认都可以添加null,除此以外,还有以下三条规则。

1. “?”不能添加元素

以“?”声明的集合,不能往此集合中添加元素,所以它只能作为生产者(亦即它只能被迭代),如下:

List<?> names = Lists.newArrayList("yiifaa");
//  通配符声明的集合,获取的元素都是Object类型
List<Object> allNames = Lists.newArrayList("yiifee");
allNames.addAll(names);
//  只能以Object迭代元素
for(Object name: names) {
    System.out.println(name);
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

2. “? extends T”也不能添加元素

以“? extends T”声明的集合,不能往此集合中添加元素,所以它也只能作为生产者,如下:

List<? extends String> names = Lists.newArrayList("yiifaa");
//  声明消费者
List<String> allNames = Lists.newArrayList("yiifee");
//  消费生产者的元素
allNames.addAll(allNames);
  • 1
  • 2
  • 3
  • 4
  • 5

相对于以“?”声明的集合,“? extends T”能更轻松地迭代元素:

List<? extends String> names = Lists.newArrayList("yiifaa");
//  能更精确地确认元素类型
for(String name: names) {
    System.out.println(name);
}
  • 1
  • 2
  • 3
  • 4
  • 5

3. “? super T”能添加元素

在通配符的表达式中,只有“? super T”能添加元素,所以它能作为消费者(消费其他通配符集合)。

List<? super String> allNames = Lists.newArrayList("yiifaa");
//
List<String> names = Lists.newArrayList("yiifee");
//  可以直接添加泛型元素
allNames.addAll(names);
//  也可以添加通配符泛型元素
List<? extends String> names1 = Lists.newArrayList("yiifee");
allNames.addAll(names1);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

针对采用“? super T”通配符的集合,对其遍历时需要多一次转型,如下:

//  只能获取到Object类型
for(Object name: allNames) {
    //  这里需要一次转型
    System.out.println(name);
}
  • 1
  • 2
  • 3
  • 4
  • 5

结论

JAVA泛型通配符的使用规则就是赫赫有名的“PECS”(生产者使用“? extends T”通配符,消费者使用“? super T”通配符)。

分享到:
评论

相关推荐

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

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

    Java泛型

    - 这是PECS(Producer Extends, Consumer Super)原则的简写,有助于指导泛型通配符的正确使用。 总之,Java泛型通过引入类型参数,增强了代码的类型安全,简化了类型转换,并提高了代码的重用性。理解和熟练运用...

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

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

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

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

    java基础泛型 学习全文件

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

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

    在Java中,extends和super是两个重要的泛型通配符,它们用于限制类型参数的范围。了解它们的区别非常重要,否则可能会导致编程错误。 extends关键字 在泛型中,extends关键字用于限制类型参数的上界。例如,List...

    K_Generic--Bounds Wildcards知乎回答1

    PECS(Producer Extends, Consumer Super)原则是处理泛型通配符的一个指导原则。"Producer Extends"意味着当一个泛型类型作为生产者时,应该使用上界通配符,因为它只往外提供数据(get)。"Consumer Super"则表示...

    Java Generics Cheatsheet

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

    存取原则和PECS法则

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

    通配符泛型

    通配符泛型是Java编程语言中的一种特性,它允许我们在定义和使用泛型时引入一种灵活的约束机制,使得代码具有更好的通用性和兼容性。通配符泛型的使用可以提升代码的可读性和可维护性,同时避免类型转换异常。 在...

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

    **强制规定**:使用泛型通配符 `&lt;? extends T&gt;` 来接收返回的数据时,此类型的泛型集合无法使用 `add` 方法;而 `&lt;? super T&gt;` 无法使用 `get` 方法。在接口调用赋值时需谨慎。 **说明**:PECS (Producer Extends ...

Global site tag (gtag.js) - Google Analytics