Java 泛型通配符
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 泛型通配符的更多相关文章
- Java 泛型 通配符类型
Java 泛型 通配符类型 @author ixenos 摘要:限定通配符类型.无限定通配符类型.与普通泛型区别.通配符捕获 通配符类型 通配符的子类型限定(?都是儿孙) <? extends ...
- Java泛型 通配符? extends与super
Java 泛型 关键字说明 ? 通配符类型 <? extends T> 表示类型的上界,表示参数化类型的可能是T 或是 T的子类 <? super T> 表示类型下界(Java ...
- [转]JAVA泛型通配符T,E,K,V区别,T以及Class<T>,Class<?>的区别
原文地址:https://www.jianshu.com/p/95f349258afb 1. 先解释下泛型概念 泛型是Java SE 1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被 ...
- java泛型通配符?
转自:http://www.linuxidc.com/Linux/2013-10/90928.htm T 有类型 ? 未知类型 一.通配符的上界 既然知道List<Cat>并不是Lis ...
- 理解Java泛型 通配符 ? 以及其使用
什么是泛型: 泛型从字面上理解,是指一个类.接口或方法支持多种类型,使之广泛化.一般化和更加通用.Java中使用Object类来定义类型也 能实现泛型,但缺点是造成原类型信息的丢失,在使用中容易造成C ...
- JAVA 泛型 通配符? extends super限定,实例区分extends super限定的作用用法
java泛型中的关键字 ? 表示通配符类型 <? extends T> 既然是extends,就是表示泛型参数类型的上界,说明参数的类型应该是T或者T的子类. <? super T& ...
- JAVA泛型通配符T,E,K,V区别,T以及Class<T>,Class<?>的区别
1. 先解释下泛型概念 泛型是Java SE 1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数.这种参数类型可以用在类.接口和方法的创建中,分别称为泛型类.泛型接口.泛 ...
- java泛型通配符详解
前言 泛型带来的好处 泛型中通配符 常用的 T,E,K,V,? ?无界通配符 上界通配符 < ? extends E> 下界通配符 < ? super E> ?和 T 的区别 ...
- Java 泛型通配符 T,E,K,V,?
Java 泛型(generics)是 JDK 5 中引入的一个新特性, 泛型提供了编译时类型安全检测机制,该机制允许开发者在编译时检测到非法的类型. 泛型的本质是参数化类型,也就是说所操作的数据类型被 ...
- JAVA 泛型通配符 ? EXTENDS SUPER 的用法
1. <? extends Hero> ArrayList heroList<? extends Hero> 表示这是一个Hero泛型或者其子类泛型heroList 的泛型可能 ...
随机推荐
- 再读c++primer plus 002
1.读取char值时,与读取其它基本类型一样,cin将忽略空格和换行符,函数cin.get(ch)读取输入的下一个字符(即使是空格),并将其赋给变量ch. 2.指针和const:(1)让指针指向一个常 ...
- java中正则表达式常用方法
一.匹配 String matches()方法.用规则匹配整个字符串,只要有一处不符合规则,就匹配结束,返回false. 举例: public static void checkQQ(){ Stri ...
- 在vue或者react中使用express框架
在react 或者 vue项目中使用express框架 1.创建vue或者 react 项目 2.在项目中创建server文件夹,创建server.js //require()方法引入express模 ...
- IE与非IE window.onload调用
IEwin.attachEvent('onload', function(){ });非IEwin.onload=function(){}; if(navigator.appName == " ...
- linux source命令的用法
source命令用法:source FileName作用:在当前bash环境下读取并执行FileName中的命令.(如把ls写入a.txt,然后source a.txt 就会执行ls命令,列出目录)注 ...
- 20155205 2016-2017-2 《Java程序设计》第2周学习总结
20155205 2016-2017-2 <Java程序设计>第2周学习总结 教材学习内容总结 变量 变量在命名时有一些规则,它不可以使用数字作为开头,也不可以使用特殊字符. 对常用忽略符 ...
- 1057 Stack 树状数组
Stack is one of the most fundamental data structures, which is based on the principle of Last In Fir ...
- BUG 图片元素img下 高度超出 出现多余空白
BUG 图片元素img下 高度超出 出现多余空白 1.将图片转换为块级对象 即,设置img为“display:block;”. 2.设置图片的垂直对齐方式 即设置图片的vertical-align ...
- 团队项目之UML图设计---WeEdit
团队信息: 学号: 姓名: 本次博客链接: 041602209 黄毓明(临时队长) https://www.cnblogs.com/mingsonic/p/9820702.html 06160023 ...
- Hdu2204 Eddy's爱好 2017-06-27 16:11 43人阅读 评论(0) 收藏
Eddy's爱好 Time Limit : 3000/1000ms (Java/Other) Memory Limit : 32768/32768K (Java/Other) Total Subm ...