package com.waston;

import java.util.*;

public class Main {

    public static void main(String[] args) {

        List<String> list = new ArrayList<>();
list.add("aa");
list.add("bb");
testQuestion(list);
System.out.println("-----------------------------------"); testExtends(Arrays.asList(new Integer[]{1, 2, 3, 4}));
System.out.println("-----------------------------------"); testSuper(new ArrayList<>()); } /**
* 无限定通配符(?), 不能往容器里添加元素, 只能获取Object的引用
* @param list
*/
public static void testQuestion(List<?> list) {
// list.add(1) ERROR
//遍历
for (Object o : list) {
System.out.println(o);
}
} /**
* ? extends T 限定符 T为具体的Java类型
* 只能读取T的引用, 因为T是上限 T是容器里所有元素的基类 ,不能往容器添加元素.
* 比如List<? extends Number> list 可以接收List<Integer>, 也可以接收List<Double>, List<Number>
* 所以list容器不能判断是该加Integer类型, 还是Double类型, 所以不能添加元素
* 但是知道容器有一个上限基类Number. 所以读取是可行的
* @param list
*/
public static void testExtends(List<? extends Number> list) {
//list.add(1); ERROR
for(Number i : list) {
System.out.println(i);
}
} /**
* ? super T 限定符
* 可以添加T类型元素, 可以读取但是需要用Object来接收, 不能用T接收, 也就是说不能读取T类型元素
* 参数可以穿List<Number>, List<Integer>, List<Object> 只要是T的基类即可
* 比方说List<? super Integer> list 这个容器里的元素肯定是Integer的基类型, 因此
* 可以添加Integer类型.
* @param list
*/
public static void testSuper(List<? super Integer> list) {
list.add(Integer.valueOf(1));
list.add(Integer.valueOf(2));
list.add(Integer.valueOf(3));
//Integer e = list.get(0); ERROR
Object object = list.get(0); //Right
System.out.println(object);
} }

总的说来, 用时遵循PECS原则即可

即生产(读取) 用Extends, 消费(添加) 用super

Java 泛型通配符的更多相关文章

  1. Java 泛型 通配符类型

    Java 泛型 通配符类型 @author ixenos 摘要:限定通配符类型.无限定通配符类型.与普通泛型区别.通配符捕获 通配符类型 通配符的子类型限定(?都是儿孙) <? extends ...

  2. Java泛型 通配符? extends与super

    Java 泛型 关键字说明 ? 通配符类型 <? extends T> 表示类型的上界,表示参数化类型的可能是T 或是 T的子类 <? super T> 表示类型下界(Java ...

  3. [转]JAVA泛型通配符T,E,K,V区别,T以及Class<T>,Class<?>的区别

    原文地址:https://www.jianshu.com/p/95f349258afb 1. 先解释下泛型概念 泛型是Java SE 1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被 ...

  4. java泛型通配符?

    转自:http://www.linuxidc.com/Linux/2013-10/90928.htm T  有类型 ?  未知类型 一.通配符的上界 既然知道List<Cat>并不是Lis ...

  5. 理解Java泛型 通配符 ? 以及其使用

    什么是泛型: 泛型从字面上理解,是指一个类.接口或方法支持多种类型,使之广泛化.一般化和更加通用.Java中使用Object类来定义类型也 能实现泛型,但缺点是造成原类型信息的丢失,在使用中容易造成C ...

  6. JAVA 泛型 通配符? extends super限定,实例区分extends super限定的作用用法

    java泛型中的关键字 ? 表示通配符类型 <? extends T> 既然是extends,就是表示泛型参数类型的上界,说明参数的类型应该是T或者T的子类. <? super T& ...

  7. JAVA泛型通配符T,E,K,V区别,T以及Class<T>,Class<?>的区别

    1. 先解释下泛型概念 泛型是Java SE 1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数.这种参数类型可以用在类.接口和方法的创建中,分别称为泛型类.泛型接口.泛 ...

  8. java泛型通配符详解

    前言 泛型带来的好处 泛型中通配符 常用的 T,E,K,V,? ?无界通配符 上界通配符 < ? extends E> 下界通配符 < ? super E> ?和 T 的区别 ...

  9. Java 泛型通配符 T,E,K,V,?

    Java 泛型(generics)是 JDK 5 中引入的一个新特性, 泛型提供了编译时类型安全检测机制,该机制允许开发者在编译时检测到非法的类型. 泛型的本质是参数化类型,也就是说所操作的数据类型被 ...

  10. JAVA 泛型通配符 ? EXTENDS SUPER 的用法

    1. <? extends Hero> ArrayList heroList<? extends Hero> 表示这是一个Hero泛型或者其子类泛型heroList 的泛型可能 ...

随机推荐

  1. 【Linux】ApacheBench(ab)压力测试工具

    AB的简介 ab是apachebench命令的缩写. ab是apache自带的压力测试工具.ab非常实用,它不仅可以对apache服务器进行网站访问压力测试,也可以对或其它类型的服务器进行压力测试.比 ...

  2. Django+Uwsgi+Nginx项目部署文档

    一.基本环境搭建 1)查看服务器 [root@Myjumpserver ~]# cat /etc/sysconfig/selinux SELINUX=disabled SELINUXTYPE=targ ...

  3. Firefox table 不居中解决办法 解决火狐层或 table 不居中

    Firefox table 不居中解决办法: table 使用 align="center" ,IE正常,Firefox 却是居左了,网上有各种解决的办法,比如在table外面再套 ...

  4. oracle远程连接

    1.1.1    修改文件: 1.1.2    修改net Manager(可省略) 1.1.3    修改任何都需要重启oracle监听和启动服务

  5. tomcat https 支持android 6.0及以上版本的配置方法

    <Connector port="443"  protocol="HTTP/1.1" SSLEnabled="true" scheme ...

  6. 解决设置select默认选中不生效的方法

    $scope.storageTypeList = ['Glusterfs','NFS','Ceph']; 不生效的方法: <select class="form-control&quo ...

  7. SVN被锁定的几种解决方法

    用SVN经常出现被锁定而无法提交的问题,选择解锁又提示没有文件被锁定,很是头疼.这里整理了一下SVN被锁定的几种解决方法: 1.出现这个问题后使用“清理”即"Clean up"功能 ...

  8. Hibernate关联关系配置(一对多,一对一,多对多)

    一对多 创建两个类  Manager(一这一端) Worker(多这一端)  即一个经理下有多个员工 package com.hibernate.n21; import java.util.HashS ...

  9. C#-VS远程通信

    上下文 应用程序内的一套规则.例如使用了begentransaction,就建立了一个规则:再如把synchronization特性应用到某个对象,是多个线程轮流访问这个对象,这也在当前应用产生了一个 ...

  10. 【MySQL】死锁问题分析

    1.MySQL常用存储引擎的锁机制: MyISAM和MEMORY采用表级锁(table-level locking)   BDB采用页面锁(page-level locking)或表级锁,默认为页面锁 ...