`
wangyanlong0107
  • 浏览: 480314 次
  • 性别: 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 泛型通配符的一个实例

    * 一个参数通配符的实例 * 说明:对一个包含了数值元素的集合进行汇总运算。在这种情况下,用户并不关心 * 集合中的每一个对象是什么类型,只要它是数值型即可,而且,用户也希望集合中可以 * 存放不同类型的数值...

    Java泛型通配符

    NULL 博文链接:https://mydownload.iteye.com/blog/1330570

    Java泛型编程指南.pdf

    Java泛型编程指南.pdf 此文章译自SUN的泛型编程指南

    Java泛型和集合

    Java Generics and Collections 英文版,详细描述java 泛型技术

    JAVA泛型加减乘除

    这是一个使用JAVA实现的泛型编程,分为两部分,第一部分创建泛型类,并实例化泛型对象,得出相加结果。 第二部分用户自行输入0--4,选择要进行的加减乘除运算或退出,再输入要进行运算的两个数,并返回运算结果及...

    java 泛型接口示例

    java 泛型接口示例 java 泛型接口示例 java 泛型接口示例

    java基础-泛型通配符

    java基础-泛型通配符

    java 泛型类的类型识别示例

    java 泛型类的类型识别示例 java 泛型类的类型识别示例 java 泛型类的类型识别示例

    1.java泛型定义.zip

    1.java泛型定义.zip1.java泛型定义.zip1.java泛型定义.zip1.java泛型定义.zip1.java泛型定义.zip1.java泛型定义.zip1.java泛型定义.zip1.java泛型定义.zip1.java泛型定义.zip1.java泛型定义.zip1.java泛型定义.zip1....

    java 泛型方法使用示例

    java 泛型方法使用示例 java 泛型方法使用示例 java 泛型方法使用示例

    4.java泛型的限制.zip

    4.java泛型的限制.zip4.java泛型的限制.zip4.java泛型的限制.zip4.java泛型的限制.zip4.java泛型的限制.zip4.java泛型的限制.zip4.java泛型的限制.zip4.java泛型的限制.zip4.java泛型的限制.zip4.java泛型的限制.zip...

    java泛型技术之发展

    java泛型技术之发展,学习JAVA 泛型的不错东东

    Java泛型的用法及T.class的获取过程解析

    主要介绍了Java泛型的用法及T.class的获取过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

    java泛型例子

    java泛型例子 内涵泛型类,泛型接口,泛型方法,泛型通配符使用,泛型上界下界,泛型数组,嵌套泛型等,很详细。放入myeclipse可用,已测试。

    Java中泛型通配符的使用方法示例

    主要介绍了Java中泛型通配符的使用方法,结合实例形式分析了java中泛型通配符的功能、语法及在泛型类创建泛型对象中的使用方法,需要的朋友可以参考下

    java泛型总结

    深入理解java泛型,包括类名泛型的定义,方法泛型定义,泛型的返回

    java泛型学习ppt

    java,学习java泛型,java培训之泛型.pptxjava培训之泛型.pptxjava培训之泛型.pptxjava培训之泛型.pptx

    很好的Java泛型的总结

    很好的Java泛型的总结,看完之后你一定会知道java泛型的底层机制,你一定会学会Java泛型!

    java泛型详解.pdf

    java泛型详解.pdf

    一看就懂 详解JAVA泛型通配符T,E,K,V区别

    泛型从字面上理解,是指一个类、接口或方法支持多种类型,使之广泛化、一般化和更加通用。通配符只有在修饰一个变量时会用到,使用它可方便地引用包含了多种类型的泛型;下面我们来深入了解一下吧

Global site tag (gtag.js) - Google Analytics