博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
复习一下,? extends T 和 ? super T
阅读量:6432 次
发布时间:2019-06-23

本文共 1712 字,大约阅读时间需要 5 分钟。

前话

最近学一些杂七杂八的东西,都把基础给忘了。

比如Java泛型中的 ? extends T? super T 吧。
刚看开源项目的时候遇到它,表情如下:

01


源码分析

直接用源码来讲解吧

package me.pwcong.test;import java.util.ArrayList;import java.util.List;public class Test {
public static void main(String[] args) { List
list1=new ArrayList<>(); list1.add(new Animal()); //错误,无法添加 list1.add(new Cat()); //错误,无法添加 list1.add(null); //正确,可以添加 ... list1.get(1); //正确,可以获取,返回值类型为Animal List
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
cats=new ArrayList<>(); touchAnimal(cats); List
dogs=new ArrayList<>(); touchAnimal(dogs); } public static void touchAnimal(List
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

你可能感兴趣的文章
java-信息安全(十一)-非对称加密算法ECC以及ECDSA签名
查看>>
(转)Flex的编译过程--ActionScript字节码(ABC)
查看>>
Directory Listing Denied
查看>>
今天讲座的感悟--java
查看>>
o(1)复杂度之双边滤波算法的原理、流程、实现及效果。
查看>>
corner2
查看>>
我见过的几种类型的员工(转)
查看>>
web前端的十种jquery特效及源码下载
查看>>
poj 3414 Pots (bfs+线索)
查看>>
Binary search
查看>>
http://jingyan.baidu.com/article/08b6a591f0fafc14a9092275.html
查看>>
MySQL查询数据表的Auto_Increment(自增id)
查看>>
java多线程系类:JUC集合:01之框架
查看>>
【Linux】 源码安装make命令详解,避免踩坑
查看>>
数据库中间表插入乱序
查看>>
[Python爬虫] 之四:Selenium 抓取微博数据
查看>>
使用OPENROWSET爆破SQL Server密码
查看>>
Mac_安装Homebrew以及Maven
查看>>
eclipse web开发Server配置
查看>>
曹政--互联网搜索老师傅
查看>>