复习一下,? extends T 和 ? super T
前话
最近学一些杂七杂八的东西,都把基础给忘了。
比如Java泛型中的 ? extends T
和 ? super T
吧。
刚看开源项目的时候遇到它,表情如下:
源码分析
直接用源码来讲解吧
package me.pwcong.test;
import java.util.ArrayList;
import java.util.List;
public class Test {
public static void main(String[] args) {
List<? extends Animal> list1=new ArrayList<>();
list1.add(new Animal()); //错误,无法添加
list1.add(new Cat()); //错误,无法添加
list1.add(null); //正确,可以添加
...
list1.get(1); //正确,可以获取,返回值类型为Animal
////////////////////////
List<? super Animal> list2=new ArrayList<>();
list2.add(new Animal()); //正确,可以添加
list2.add(new Cat()); //正确,可以添加
list2.get(1); //正确,可以获取,返回值类型为Object
}
public class Animal{}
public class Cat extends Animal{}
}
结论
? extends T
:限定了取出数据的类型为T。编译器无法确定 List 所持有的类型,所以无法安全的向其中添加对象。可以添加 null ,因为 null 可以表示任何类型。所以 List 的 add 方法不能添加任何有意义的元素,但是可以接受现有的子类型List< T > 赋值。
? super T
:限定了存入数据类型为 T 或者 T 的子类。因为,List< ? super T >中的类型可能是任何 T 的超类型,所以编译器无法确定get返回的对象类型是 T ,还是 T 的子类,因此返回 Object 类型。
那它的作用是什么呢?下面还是用源码解释吧:
package me.pwcong.test;
import java.util.ArrayList;
import java.util.List;
public class Test {
public static void main(String[] args) {
List<Cat> cats=new ArrayList<>();
touchAnimal(cats);
List<Dog> dogs=new ArrayList<>();
touchAnimal(dogs);
}
public static void touchAnimal(List<? extends Animal> list){
for(Animal animal:list){
//do something
}
}
public class Animal{}
public class Cat extends Animal{}
public class Dog extends Animal{}
}
touchAnimal方法限制了传入的List的数据类型为Animal或Animal的子类,起到了参数限制的作用。
复习一下,? extends T 和 ? super T的更多相关文章
- <? extends T> 及 <? super T> 重温
<? extends T> 及<? super T> 重温 本文针对泛型中<? extends T> 及<? super T>的主要区别及使用用途进行讨 ...
- 浅谈Java泛型之<? extends T>和<? super T>的区别
关于Java泛型,这里我不想总结它是什么,这个百度一下一大堆解释,各种java的书籍中也有明确的定义,只要稍微看一下就能很快清楚.从泛型的英文名字Generic type也能看出,Generic普通. ...
- Java泛型的定义以及对于<? extends T>和<? super T>
Java 中对于泛型方法的定义: public <T> T getT(){ .....相关代码; } 其中我对<T>的理解就是申明只是一个泛型方法的标记,T是返回的类型. 对于 ...
- <? extends T>和<? super T>
转自:Java泛型中extends和super的区别? 另,问题来源:Java 泛型 <? super T> 中 super 怎么 理解?与 extends 有何不同? <? ext ...
- <? extends T>和<? super T>的理解
背景:对泛型中使用super和extends关键字进行分析总结. 问题: public class TestExtend { public static void main(String[] args ...
- ES6 extends继承及super使用读书笔记
extends 继承 extends 实现子类的继承 super() 表示父类的构造函数, 子类必须在 constructor中调用父类的方法,负责会报错. 子类的 this 是父类构造出来的, 再在 ...
- 一文搞懂List 、List<Object>、List<?>的区别以及<? extends T>与<? super T>的区别
前段时间看<Java编程思想>泛型时对 <? extends T>与<? super T>很懵逼,接着看到泛型与集合的更蒙蔽,随后又翻开<码出高效>时, ...
- 谈谈<? extends T> 和<? super T>理解
项目中遇到<? extends T> 和<? super T> 这两者,来说说自己的理解.首先我们先了解什么是泛型 什么是泛型 泛型是在编译阶段一种防止错误对象输入的机制.编译 ...
- JAVA泛型知识--> <? extends T>和<? super T>
<? extends T> 和 <? super T> 是Java泛型中的“通配符(Wildcards)” 和 “边界(Bounds)”的概念 <? extends T& ...
随机推荐
- Android Paint的使用以及方法介绍(附源码下载)
要绘图,首先得调整画笔,待画笔调整好之后,再将图像绘制到画布上,这样才可以显示在手机屏幕上.Android 中的画笔是 Paint类,Paint 中包含了很多方法对其属性进行设置,主要方法如下: se ...
- haproxy实现mysql从库负载均衡
本文主要讲述通过haproxy实现mysql从库间的负载均衡,至于mysql主从的搭建,本文不再重述,可以参考我之前写的博客. 1.首先下载haproxy包 wget http://haproxy.1 ...
- 《实时控制软件设计》Git 基本操作练习
根据老师提供的教程 对 数据库创建.提交文件.创建分支.删除分支.合并分支.冲突处理等操作进行了练习 得到log文件如下: yanbin-guo@yanbinguo MINGW64 /Git (mas ...
- text-overflow 与 word-wrap:设置使用一个省略标记...标示对象内文本的溢出。
text-overflow 与 word-wrap text-overflow用来设置是否使用一个省略标记(...)标示对象内文本的溢出. 语法: 但是text-overflow只是用来说明文字溢出时 ...
- linux打包压缩命令汇总
tar命令 [root@linux ~]# tar [-cxtzjvfpPN] 文件与目录 ....参数:-c :建立一个压缩文件的参数指令(create 的意思):-x :解开一个压缩文件的参数指令 ...
- string::rfind
该函数返回目标字符串(key)在源字符串中最后一次匹配的位置 如果没有找到匹配的位置则返回string::npos,是一个无符号整形数字,可以打印看看 //// string::rfind #incl ...
- 利用doScroll在IE浏览器里模仿DOMContentLoaded
稍微了解一点框架的事件绑定的都知道 window.onload 事件需要在页面所有内容(包括图片.flash.iframe等)加载完后,才执行,但往往我们更希望在 DOM 一加载完就执行脚本,而各大框 ...
- 《JavaScript高级程序设计》第3章 基本概念
3.4 数据类型 3.4.1 typeof操作符 var message = 'some string'; console.log(typeof message); // 'string' conso ...
- HDU 5593 ZYB's Tree 树形dp
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5593 题意: http://bestcoder.hdu.edu.cn/contests/contes ...
- Eclipse支持Jquery代码提示(JqeuryWTP)
问题描述: Eclipse支持Jquery代码提示 问题解决: 下载 JqueryWTP.jar文件 文件替换 在Eclipse/plugin 路径下, ...