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

  通配符上限:<? 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. eclipse中使用maven插件的时候,运行run as maven build/clean的时候报错

    -Dmaven.multiModuleProjectDirectory system propery is not set. Check $M2_HOME environment variable a ...

  2. 用PowerMockito来mock私有方法(转)

    话说我们做的所谓的接口测试真的是不伦不类啊,测的是controller层,那叫接口木??!!可是老大们说写的是接口测试,那就接口吧! 自接手写这个接口测试不久,很多人,包括一个关系比较好的架构师就跟我 ...

  3. jsp各部分编码的含义

    服务器JSP编码 pageEncoding 是jsp文件本身的编码, 第一阶段是jsp编译成.java,它会根据pageEncoding的设定读取jsp,(jsp文件的编码,pageEncoding是 ...

  4. Bernstein polynomials

    Bernstein多项式能够用来一致逼近闭区间上的连续函数. 对于[0,1]上的连续函数f(x),定义Bernstein多项式 B_n(f,x) = sum{k=0..n} f(k/n)C(k,n)t ...

  5. Codeforces Beta Round #10 B. Cinema Cashier (树状数组)

    题目大意: n波人去k*k的电影院看电影. 要尽量往中间坐,往前坐. 直接枚举,贪心,能坐就坐,坐在离中心近期的地方. #include <cstdio> #include <ios ...

  6. sql: sql developer tunnel转接

    Use putty tunnel instead of login terminal server 有时候本地直接ping不通sql 的server, 但另一个server能连上,这时就可以把端口和i ...

  7. winform利用代码将控件置于顶端底端

    有时,我们可能动态的添加控件,并准备将其置于对顶层或最底层.实现的方法有两个: 一种方法是在WinForm窗体中使用Controls控件集的SetChildIndex方法,该方法将子控件设定为指定的索 ...

  8. WCF技术剖析之二十: 服务在WCF体系中是如何被描述的?

    原文:WCF技术剖析之二十: 服务在WCF体系中是如何被描述的? 任何一个程序都需要运行于一个确定的进程中,进程是一个容器,其中包含程序实例运行所需的资源.同理,一个WCF服务的监听与执行同样需要通过 ...

  9. Jackson ObjectMapper类

    ObjectMapper类是Jackson库的主要类.它提供一些功能将转换成Java对象匹配JSON结构,反之亦然.它使用JsonParser和JsonGenerator的实例实现JSON实际的读/写 ...

  10. SharePoint 2013的100个新功能之搜索(二)

    一:名称建议 人员搜索中新的“名称建议”功能,微软引入了一种简单.直观的方式来根据名称找到用户.输入一个或多个字符,查看全部以其开头的名称,在所有的用户描述数据库都可用,在人员索引中也因此一样可用.该 ...