一.通配符上限和通配符下限接受的类型

  通配符上限:<? extends T>

  通配符下限:<? super T>

  以下代码是测试结果,注释为解释说明

 package xayd.hjj;

 import java.util.ArrayList;
import java.util.List; class A{}
class B extends A implements F{}
class C extends A{}
class D extends A{}
class E{}
interface F{} public class Test{ public static void main(String[] args) { //下面五行代码说明:List<? extends A>接受A或者继承A的类
List<? extends A> listA = new ArrayList<A>();
List<? extends A> listB = new ArrayList<B>();
List<? extends A> listC = new ArrayList<C>();
List<? extends A> listD = new ArrayList<D>();
// List<? extends A> listE = new ArrayList<E>(); //编译不能通过,类E与类A无关 //下面三行代码说明:List<? super B>接受B或者的父类
List<? super B> listA1 = new ArrayList<A>();
       List<? super B> listA2 = new ArrayList<B>();
List<? super B> listF = new ArrayList<F>();
//List<? super B> listC1 = new ArrayList<C>(); //编译不能通过,类C不是类B的父类 30 }
}

 

   二.通配符下限和通配符上限存取问题

   通配符上限:<? extends A>

   List<? extends A> list = new ArrayList<B>();

   这样定义一个list的时候,是不允许向这个list添加任何东西的。list可以接受其B类型和B的子类。像list中添加对象的时候因为编译器不能确定这个子类的确切类型,因此不允许向里添加任何对象。唯一可以添加的是null。也可以这样理解:Fruit是Apple的父类,也是orange的父类。但是你不能说Fruit就是Apple或者orange。

   代码测试如下:

 package xayd.hjj;

 import java.util.ArrayList;
import java.util.List;
class A{}
class B extends A implements F{}
class C extends A{}
class D extends A{}
class E{}
interface F{}
public class Test{
public void a(List<? extends A> list){
list.add(null); //编译通过,但无实际意义
// list.add(new B()); //编译不能通过
// list.add(new A()); //编译不能通过 } public static void main(String[] args) {
Test test = new Test();
List<? extends A> listB = new ArrayList<B>();
test.a(listB); }
}

  

  通配符下限:<? super B>

  List<? super B> list = new ArrayList<A>();

  这样定义一个list的时候,允许向这个list添加对象。list可以接受其B类型和B的父类。像list中添加对象的时候编译器能确定确切类型。也可以这样理解:Fruit是Apple的父类,也是orange的父类。我们可以说Apple就是一个Fruit。

   代码测试如下:

 package xayd.hjj;

 import java.util.ArrayList;
import java.util.List;
class A{}
class B extends A implements F{}
class C extends A{}
class D extends A{}
class E{}
interface F{}
public class Test{ public void b(List<? super B> list){ list.add(new B()); ////编译通过
//list.add(new A()); //编译不能通过,要使用类型转换
list.add((B) new A()); ////编译通过 }
public static void main(String[] args) {
List<? super B> listA = new ArrayList<A>();
test.b(listA); }
}

JAVA泛型之<? extends T>:(通配符上限)和<? super T>(通配符下限)的更多相关文章

  1. 浅谈Java泛型之<? extends T>和<? super T>的区别

    关于Java泛型,这里我不想总结它是什么,这个百度一下一大堆解释,各种java的书籍中也有明确的定义,只要稍微看一下就能很快清楚.从泛型的英文名字Generic type也能看出,Generic普通. ...

  2. Java泛型中extends和super的理解(转)

    E – Element (在集合中使用,因为集合中存放的是元素) T – Type(Java 类) K – Key(键) V – Value(值) N – Number(数值类型) ? – 表示不确定 ...

  3. Java泛型中extends和super的理解

    作者:zhang siege链接:https://www.zhihu.com/question/20400700/answer/91106397来源:知乎著作权归作者所有.商业转载请联系作者获得授权, ...

  4. java泛型中extends 和 super的区别

    一般对泛型中extends 和 super 的区别是这样介绍的: 关键字说明 ? 通配符类型 <? extends T> 表示类型的上界,表示参数化类型的可能是T 或是 T的子类 < ...

  5. JAVA泛型知识--> <? extends T>和<? super T>

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

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

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

  7. java泛型<? extends E> 有上限通配符与<? Super E>有上限通配符

    通配符?,?表示占位,表明将来使用的时候在指明类型 <?>无限定的通配符, 是让泛型能够接受未知类型的数据 <? extends E> 有上限通配符,能够接受指定类及其子类类型 ...

  8. Java笔记2 : 泛型的体现,及其上限、下限、通配符

    Java中的泛型是在jdk5.0引入的,语法不难,但是需要注意的细节有很多,这里写一下备忘. 首先是最简单的泛型类,泛型方法,泛型接口: //泛型接口的定义 interface MyInter< ...

  9. Java泛型-通配符的上限和下限问题

    Java的泛型中,通配符可以设置上限和下限. 上限:<? extends T> ?是T和T的子类 下限:<? super T> ?是T和T的父类 怎么看待这个上限和下限呢 首先 ...

随机推荐

  1. MySQL如何查询LINESTRING数据

    我有一个提交的命名crm_geo_org,具有以下结构 ipoid INTEGER 11 NOT NULL PRIMARY KEY beginip INTEGER 14 NOT NULL UNSIGN ...

  2. 在不同编译环境中如何使用sleep()函数

    今天在学习有关时间函数时,想让程序暂时挂起,一段时间后在继续执行! 用到了系统函数sleep(): 在vc下sleep函数是以毫秒为单位,如果想让其停留3秒,需要这样做  sleep(3*1000); ...

  3. textarea内容有换行时存入数据库丢失问题的解决 (转载)

    http://blog.csdn.net/zhang_j_h/article/details/44563167 存入: function GetInputData(id, cmd) { var pos ...

  4. delphi如何加上spliter分割条,任意调整大小

    如题1:如何把一个panel分割成四个小的panle 2:也就是如何加上spliter,分割条,任意调整大小 3.如何有独立的handle使用多个总共5个为什么呢,你放4个panel 然后放split ...

  5. perl $d = encode_utf8($r); $f = decode_json($d)

    [root@dr-mysql01 ~]# cat a1.pl my $url="http://192.168.32.101:3000/api/getcode?env=zj&phone ...

  6. SVN 1.8.x 服务器安装(转)

    目录[-] 一. SVN 服务器下载.安装 1. 关于 Subversion 1.8.11 2. 兼容性问题 3. 安装包下载 3.1 VisualSVN 3.2 Win32Svn 3.3 SlikS ...

  7. Qt4_VS10 程序打包发布

    源地址:http://www.2cto.com/kf/201306/217205.html 目录结构如下: ---------------------------------------------- ...

  8. Cloudera Hadoop 4 实战课程(Hadoop 2.0、集群界面化管理、电商在线查询+日志离线分析)

    课程大纲及内容简介: 每节课约35分钟,共不下40讲 第一章(11讲) ·分布式和传统单机模式 ·Hadoop背景和工作原理 ·Mapreduce工作原理剖析 ·第二代MR--YARN原理剖析 ·Cl ...

  9. Codeforces Round #311 (Div. 2)

    我仅仅想说还好我没有放弃,还好我坚持下来了. 最终变成蓝名了,或许这对非常多人来说并不算什么.可是对于一个打了这么多场才好不easy加分的人来说,我真的有点激动. 心脏的难受或许有点是由于晚上做题时太 ...

  10. Swift - 做一个简单的无线U盘(手机端Http服务器搭建)

    由于iOS系统的封闭性,在数据传输方面十分不方便.不像安卓设备,直接连接电脑就能当U盘使用.所以一般我们如果用iPhone临时存取个东西,要么使用数据线连接iTunes,要么手机电脑都登上QQ,使用Q ...