复习一下,? 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& ...
随机推荐
- Linux Shel高级技巧(目录)
Linux Shell高级技巧(一) http://www.cnblogs.com/stephen-liu74/archive/2011/12/22/2271167.html一.将输入信息转换为大写字 ...
- js原型继承与多态 How to apply virtual function in javascript
function BaseClass() { this.hello = function() { this.talk(); } this.talk = function() { document.wr ...
- 团队开发之《极速蜗牛》NABC分析
一.简介 项目名称:极速蜗牛 特点:操作简单,视觉与听觉配合,让用户有最完美的体验. 二.NABC分析 N(need):在人们无时无刻离不开手机的今天,难免有无聊的时候,此刻一款操作简单又能令人们动脑 ...
- My97DatePicker控制开始时间和结束时间区间
开始时间: <input type="text" placeholder=" -请选择- " id="kssj" name=" ...
- java中的substring用法
String str="我是中国人"; str = str.substring(0, 2) +"_"+str.substring(3, 4); 结果:str=& ...
- hibernate--OneToOne
一对一(one to one) 单向关联映射 两个对象是一对一的的关系. 有两种策略可以实现一对一的关联映射 l 主键关联:即让两个对象具有相同的主键值,以表明他们之间的一对一的对应关系;数据库表不 ...
- 将通过find命令找到的文件拷贝到一个新的目录中
将通过find命令找到的文件拷贝到一个新的目录中 有这样的一个需求,需要将一部分符合条件的文件从一个目录拷贝到另一个目录中,我通过find命令从源目录查找到符合条件的文件然后使用cp命令拷贝到目标目录 ...
- BZOJ 2653 middle
AC通道:http://www.lydsy.com/JudgeOnline/problem.php?id=2653 题目大意:多组询问,求左右端点在规定范围内移动所能得到的最大中位数. [分析] 求中 ...
- 【BZOJ】【1037】【ZJOI2008】生日聚会party
DP orz iwtwiioi 这种题居然是DP……原来统计方案数是可以用动态规划来做的啊= =用一些变量来维护一些信息,保证方案可行性/合法性 人太弱实在是有些忧伤…… /************* ...
- linux命令集——<一>目录处理命令
1.ls,命令,显示当前目录下文件 命令 所在路径 功能描述 执行权限 选项 说明 ls /bin/ls 显示目录文件 所有用户可用 -a 显示所有文件,包括隐藏文件 -l 显示详细信 ...