前话

最近学一些杂七杂八的东西,都把基础给忘了。
比如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);               //正确,可以获取,返回值类型为AnimalList<? 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的子类,起到了参数限制的作用。

转载于:https://www.cnblogs.com/pwc1996/p/5957845.html

复习一下,? extends T 和 ? super T相关推荐

  1. Java泛型中extends T和super T的区别?

    <? extends T>和<? super T>是Java泛型中的"通配符(Wildcards)"和"边界(Bounds)"的概念. ...

  2. java 泛型 t extends_Java泛型的定义以及对于? extends T和? super T

    Java 中对于泛型方法的定义: public T getT(){ .....相关代码; } 其中我对的理解就是申明只是一个泛型方法的标记,T是返回的类型. 对于泛型类的定义: public clas ...

  3. 一文搞懂List 、ListObject、List?的区别以及? extends T与? super T的区别

    前段时间看<Java编程思想>泛型时对 <? extends T>与<? super T>很懵逼,接着看到泛型与集合的更蒙蔽,随后又翻开<码出高效>时, ...

  4. Java 泛型 extends T 和 super T 详解

    大概来讲: 是"上界通配符" 是"下界通配符" #####1. 为什么要用通配符和边界? 使用泛型的过程中,经常出现一种很别扭的情况.比如按照题主的例子,我们有 ...

  5. 关于 ? extends T 和 ? super T 的存在意义和使用

    问题来源:Java 泛型 <? super T> 中 super 怎么 理解?与 extends 有何不同? <? extends T>和<? super T>是J ...

  6. ES6 (二十二)Class 的继承、extends关键字、super 关键字(函数调用(constructor)、对象(父类原型对象))、原型对象(原型链)、Mixin 模式

    ES6 (二十二)Class 的继承.extends关键字.super 关键字(函数调用(constructor).对象(父类原型对象)).原型对象(原型链).Mixin 模式 文章目录 ES6 (二 ...

  7. Java中? extends T和? super T的理解

    ? 通配符类型 - <? extends T> 表示类型的上界,表示参数化类型的可能是T 或是 T的子类; <? super T> 表示类型下界(Java Core中叫超类型限 ...

  8. 继承extends ,this super final 关键字,abstract抽象类,override方法重写

    继承extends 私有成员不能被继承  总结:子类方法中,使用变量的原则是:就近原则 1 package review06; 2 /* 3 私有成员不能被继承 4 子类和父类有同名的成员变量:在子类 ...

  9. JAVA面向对象OOP→继承extends、构造方法super、方法重写override、样例代码

    继承(extends扩展) 一个子类只有一个父类,单一继承,可以在不同包内,不同包要导入import 基类(Object)如果一个类不继承任何类,默认就自动继承Object类 子类可以对父类的属性不用 ...

最新文章

  1. vim does not map customized key?
  2. try{}里有一个 return 语句,那么紧跟在这个 try 后的 finally {}里的 code 会 不会被执行,什么时候被执行,在 return 前还是后?...
  3. jstack(查看线程)、jmap(查看内存)和jstat(性能分析)命令
  4. OpenCV的dnn模块调用TesorFlow训练的MoblieNet模型
  5. javascript class static
  6. IBM MQ 7.1在windows和linux上安装
  7. visual studio中番茄助手添加注释模板
  8. 基于SSD目标检测模型的人脸口罩识别
  9. BMFont字体编辑器的使用
  10. ESXI6.7集成net55-r8168网卡驱动,支持部分PC
  11. qt感叹号_QT使用教程(四)之初体验
  12. 软件测试中英文术语对照表
  13. Coursera Big Data系列课程笔记1
  14. 阿波罗数据集怎么下载_百度阿波罗发布全球最大的无人驾驶汽车数据集
  15. 微信开发者工具小技巧——快速创建小程序的新页面。
  16. 实战引流技巧,教你如何做好运营
  17. Elasticsearch(三) Python 使用 elasticsearch 的基本操作
  18. 【考研英语语法】代词练习题
  19. spacemacs配置
  20. 医用温度传感器的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告

热门文章

  1. 【ESP32_8266_WiFi (十二)】ESP8266客户端HTTP API应用实例
  2. android github框架大全
  3. 第二单元 The Opera Singer
  4. 如何快速掌握HTTP协议?
  5. 利用pyecharts显示微信好友性别比例
  6. 不死鸟一飞的学习网址
  7. 一、二、三代测序原理
  8. 瑞萨单片机iap串口升级boot工程的构建-学习记录
  9. h5,移动端预览pdf文件,使用pdfh5插件
  10. vsftpd 配置文件详解