博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java泛型通配符 ? extends T 和 ? super T 的区别和用法
阅读量:1952 次
发布时间:2019-04-27

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

1.二者的意思

? extends T :表示上界是T, ? 都是继承自T的,都是T的子类;

? super T :表示下界是T,?都是T的父类;

2.用法

例1,我们有多个对象,其中Cat,Dog,Chicken都是extends Animal的。

List
list = new ArrayList
(); List
list = new ArrayList
(); List
list = new ArrayList
();

此时,List ? extends Animal list是无法得知这个list究竟可能是上面的哪一种,所以,list是无法 使用add方法的,但是我们可以读取到Anumal类型的数据。

例2,我们有DogFather1,DogFather2,DogFather3,都可能是Dog的父类。

List
list = new ArrayList
(); List
list = new ArrayList
(); List
list = new ArrayList
();

这样,我们不能确定这个list里究竟是DogFather1,还是DogFather2,还是DogFather3,所以我们读取时无法得知读取的是什么类型,但是我们可以写入Dog及其子类对象。

3.总结

第一、 频繁往外读取内容的,适合用 ? extends T;

第二、 经常往里插入的,适合用 ? super T;
(阿里JAVA开发手册强制这样使用,见集合处理的第6条)

这个用法的典型用法可以在java的集合类Collections源码中找到:

public static 
void copy(List
dest, List
src) { int srcSize = src.size(); if (srcSize > dest.size()) throw new IndexOutOfBoundsException("Source does not fit in dest"); if (srcSize < COPY_THRESHOLD || (src instanceof RandomAccess && dest instanceof RandomAccess)) { for (int i=0; i
di=dest.listIterator(); ListIterator
si=src.listIterator(); for (int i=0; i

转载地址:http://zweif.baihongyu.com/

你可能感兴趣的文章
LVM逻辑卷------基础命令详解(三分钟入门)
查看>>
LVM逻辑卷------详细操作过程(三分钟上手)
查看>>
mysql——介绍及安装与基本用法
查看>>
MySQL数据库之索引
查看>>
MYSQL——事务操作+视图+存储引擎
查看>>
Mysql——完全备份+增量备份+备份恢复
查看>>
MySQL进阶查询(SELECT 语句高级用法)
查看>>
Mysql 之主从复制
查看>>
LVS负载均衡------NAT模式
查看>>
MYSQL 之 读写分离
查看>>
MYSQL 之 MHA高可用架构搭建
查看>>
部署 LVS-DR + keepalived 高可用群集
查看>>
Haproxy搭建web群集
查看>>
Nginx+Tomcat部署负载均衡
查看>>
Tomcat 与 Nginx 实现动静分离的详细部署
查看>>
Apache之工作模式(三分钟带你了解)
查看>>
LAMP架构部署及论坛搭建(apache、mysql、php)
查看>>
squid代理介绍----传统代理
查看>>
在centos7上部署 redis 和基本操作
查看>>
redis配置文件的持久化(详细对比)
查看>>