复习一下,? 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& ...
随机推荐
- Objective-C面向对象(三)
1.类的继承 OC的继承是单继承,每个子类只有一个直接父类 1.1 继承的特点 OC继承的语法 @interface SubClass :SuperClass { //成员变量定义 } //方法定义部 ...
- vbs操作txt文本文件常用方法(函数)
创建文件 dim fso, f set fso = server.CreateObject("Scripting.FileSystemObject") set f = fso.Cr ...
- proxy server 代理服务器
有时候,我觉得自己需要去搞明白.搞清楚一个概念,帮我打通一下自己的知识体系,或者说,尝试联络起来. 1. 简介 突破自身IP限制,访问国外站点. 访问单位或者团体内部资源. 突破中国电信的IP封锁. ...
- Linq中Select查询参数提取公共方法
class Program { static void Main(string[] args) { var listTest1 = new List<Test1> { "}, & ...
- eclipse部署Tomcat6 : The server does not support version 3.0 of the JEE Web module specification
为项目添加tomcat 6,发现不能添加,原因如下 这是因为Tomcat6不能为JavaEE3.0版本服务,把项目的版本降低到2.5就可以了 现在可以部署了
- poi实现Excel比较
http://stackoverflow.com/questions/866346/easiest-way-to-compare-two-excel-files-in-java http://stac ...
- 上海9000辆出租车上铺设免费微信连WiFi
据了解,去年7月,2000辆贴有Wi-Fi标识的上海大众出租车已经正式上路.近期,为了加大方便市民的力度,上海云联将上海大众等9000辆出租车上铺设免费微信连WiFi,为上海乘客提供简单便捷的微信连W ...
- 关于linux系统如何实现fork的研究(二)
本文为原创,转载请注明:http://www.cnblogs.com/tolimit/ 引言 前一篇关于linux系统如何实现fork的研究(一)通过代码已经说明了从用户态怎么通过软中断实现调用系统调 ...
- android 关于Location of the Android SDK has not been setup in the preferences的解决方法
今天在部署android开发环境的时候,每次打开eclipse的时候点击AVD Manager的按钮就会弹出Location of the Android SDK has not been setup ...
- BZOJ1083: [SCOI2005]繁忙的都市
水题之王SP…这题就裸的最小生成树 /************************************************************** Problem: 1083 User ...