复习一下,? 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& ...
随机推荐
- java中字符串String 转 int(转)
java中字符串String 转 int String -> int s="12345"; int i; 第一种方法:i=Integer.parseInt(s); 第二种方法 ...
- 设置VS2010中自带的ActiveX控件测试容器TstCon
ActiveX控件:可以看做一个极小的服务器应用程序,他不能单独运行,需要嵌入到某个程序中才可以运行,我们可以自己写一个程序来测试自己写的程序(具体方法在下一篇文章阐述),第二种方法是利用VS(本人编 ...
- Quartz.NET Windows
Quartz.NET Windows 服务示例 想必大家在项目中处理简单的后台持续任务或者定时触发任务的时候均使用 Thread 或者 Task 来完成,但是项目中的这种需求一旦多了的话就得将任务调度 ...
- NABC需求分析
我们团队项目为7-magic,在这个七巧板项目中,我们团队的这个项目有许多的特点,我就其中的一个特点:用户可以自主的用七巧板设计自己想象出的图形,并与大家分享. N (Need 需求): 你的创意解决 ...
- springmvc返回jsp源代码解决办法
url-pattern问题 spring用到forward("/WEB-INF/jsp/*.jsp")而forward当然是又要经过web.xml的映射的,然后,在URL匹配时, ...
- Java 7 中 NIO.2 的使用——第四节 文件和目录
Files类提供了很多方法用于检查在于你真正实际去操作一个文件或目录.这些方法强烈推荐,也非常有用,也能避免很多异常的发生.例如,一个很好的习惯就是在你试着移动一个文件从一个地方到另一个地方的时候,先 ...
- 第五周作业 关于C语言的问卷调查
你对自己的未来有什么规划?做了哪些准备? 目前还不是很了解,我希望自己再毕业后可以在一家IT公司上班. 目前效果还不是很明显,只是对于专业的学习更加勤奋而已. 2.你认为什么是学习?学习有什么用?现 ...
- 图解Git/图形化的Git参考手册
此页图解git中的最常用命令.如果你稍微理解git的工作原理,这篇文章能够让你理解的更透彻. 基本用法 上面的四条命令在工作目录.暂存目录(也叫做索引)和仓库之间复制文件. ● git add fil ...
- Leetcode#87 Scramble String
原题地址 两个字符串满足什么条件才称得上是scramble的呢? 如果s1和s2的长度等于1,显然只有s1=s2时才是scramble关系. 如果s1和s2的长度大于1,那么就对s1和s2进行分割,划 ...
- 2014ACM/ICPC亚洲区鞍山站 清华命题
A http://acm.hdu.edu.cn/showproblem.php?pid=5070 先跳过. B http://acm.hdu.edu.cn/showproblem.php?pid=50 ...