Java泛型支持通配符(Wildcard),可以单独使用一个"?"表示任意类,也可以使用extends关键字标识某一类(接口)的子类型,还可以使用super关键字标识某一类(接口)的父类型,但问题是什么时候该用extends,什么时候该用super?

(1)泛型结构只参与"读"操作则限定上界(extends 关键字)

于都如下代码,看业务逻辑操作是否还能继续?

1 importjava.util.Arrays;2 importjava.util.List;3

4 public classClient {5 public static voidmain(String[] args) {6 read(Arrays.asList("A"));7

8 }9

10 public static void read(List super E>list){11

12 for(Object obj:list){13

14 //业务逻辑操作

15 }16 }17 }

从List列表中读取元素操作(比如一个数字列表中的求和计算),你觉得方法read能继续写下去吗?

答案是不能,我们不知道list到底存放的是什么元素,只能推断出是E类型的父类,当然也可以是E类型,单问题是E类型的父类是什么呢?

无法再推断,只有运行时才知道,那么编码期就完全无法操作了,当然,你可以把它当作是Object类型来处理,需要时再转换成E类型,但是这样完全违背了泛型的初衷.

在这种情况下,"读"操作如果期望从List集合中读取数据就需要使用extends关键字了,也就是要界定泛型的上界,代码如下:

1 importjava.util.Arrays;2 importjava.util.List;3

4 public classClient {5 public static voidmain(String[] args) {6 read(Arrays.asList("A"));7 }8

9 public static void read(List extends E>list){10 for(E e:list){11 System.out.println(e.getClass());12 //业务逻辑处理

13 }14 }15 }

此时已经推断出List集合中取出的是E类型的元素,具体是什么类型的元素就要等到运行时才能确定了,但是它一定是一个确定的类型,比如read(Arrays.asList("A"))调用该方法时,可以推断出List中的元素类型是String,之后就可以对List中的元素进行操作了,如加入到另外的List集合中,或者作为Map的键等.

(2)泛型结构只参与"写"操作则限定下界(使用super关键字)

先看如下代码是否可以正常编译:

1 importjava.util.List;2

3 public classClient {4 public static voidmain(String[] args) {5

6 }7

8 public static void write(List extends Number>list){9 list.add(null);10 list.add(123);11 //The method add(int, capture#2-of ? extends Number)12 //in the type List is not applicable for the arguments (int)

13 }14 }

编译失败,失败的原因是list中的元素类型不确定,也就是编译期无法推断出泛型类型到底是什么,是Integer类型?是Double?还是Byte?这些都符合extends关键字的定义,由于无法确定实际的泛型类型,所以编译器聚聚了此类操作.

在此种情况下只有一个元素是可以add进去的:null值,这是因为null是一个万用类型,它可以是所有类的实例对象,所以可以加入到任何列表中.

Object是否也可以?不可以,因为它不是Number的子类,而且即使把list变量修改为List extends Object>类型也不能加入,就是因为编译器无法推断出泛型类型,加什么元素都是无效的.

在这种"写"操作的情况下,使用super关键字限定泛型类型的下界才可以.

importjava.util.ArrayList;importjava.util.Arrays;importjava.util.List;public classClient {public static voidmain(String[] args) {

}public static void write(List super Number>list) {

list.add(123);

list.add(3.14);

}

}

不用管是Integer类型还是Float类型,都可以加入到list列表中,因为它们都是Number累心g,zhejiu保证了泛型类的可靠性.

对于要限定上界还是下界,JDK的Collecctions.copy方法是一个非常好的例子,它实现了把源列表中的所有元素拷贝到目标列表中对应的索引位置上.代码如下:

1 public static void copy(List super T> dest, List extends T>src) {2 int srcSize =src.size();3 if (srcSize >dest.size())4 throw new IndexOutOfBoundsException("Source does not fit in dest");5

6 if (srcSize < COPY_THRESHOLD ||

7 (src instanceof RandomAccess && dest instanceofRandomAccess)) {8 for (int i=0; i di=dest.listIterator();12 ListIterator extends T> si=src.listIterator();13 for (int i=0; i

源列表是用来提供数据的,所以src变量需要限定上界,带有extends关键字,目标列表是用来写入数据的,所以dest变量需要界定上界,带有super关键字.

如果一个泛型结构即用作"读"操作又用作"写"操作,那该如何进行限定呢?

不限定,使用确定的泛型类型即可,如List.

Java不同场景加载不同类_[改善Java代码]不同的场景使用不同的泛型通配符相关推荐

  1. 未能成功加载扩展程序_【JAVA虚拟机(JVM)精髓】09-几种不同的类加载器

    持续更新JVM相关知识,敬请关注: Java虚拟机精髓专栏​zhuanlan.zhihu.com 上一节说了下类加载器和类加载过程.这一节我们看下几种不同的类加载器. JVM支持的类加载器有两类,分别 ...

  2. 动态加载子节点_微信小游戏开发之场景切换和常驻节点传递数据

    主题 场景切换 场景间数据传递方式 小游戏全局背景音效 特别说明 CocosCreator微信小游戏开发系列文章,是我在逐步开发过程中,基于官方文档之上,记录一些重点内容,以及对官方文档中有些知识点的 ...

  3. java加快页面加载速度方法_关于页面加载速度优化的11种方法

    1.合并js和css文件 将js和css分别合并到一个共享文件,这样不仅能够简化代码,而且在执行js文件是,如果js文件较多,就需要多次向服务器请求数据,这样将会延长加载速度,将js文件合并在一起,减 ...

  4. 这篇文章绝对让你深刻理解java类的加载以及ClassLoader源码分析

    前言 package com.jvm.classloader;class Father2{public static String strFather="HelloJVM_Father&qu ...

  5. java中类的加载顺序

    java中类加载顺序: 1)静态代码块只执行一次:静态代码块首先被初始化 2)构造代码块在每次创建对象都会执行:构造函数都是最后执行的. 3)按照父子类继承关系进行初始化,先执行父类的初始化: 4)程 ...

  6. Java 热更新 加载class和jar

    1.首先了解下java几个加载器的基本原理: Java 中的类加载器大致可以分成两类,一类是系统提供的,另外一类则是由 Java 应用开发人员编写的.系统提供的类加载器主要有下面三个:       引 ...

  7. krpano 场景切换 通知_一个基于Vulkan的异步场景加载设计

    异步场景加载基本流程验证完成. 此方法理论上只需要使用3个Vulkan的指令队列. 对于移动平台上的Vulkan,指令队列数量极少,比如Adreno640只有3个指令队列可用.所以理论上这一设计也适合 ...

  8. Java实现动态加载页面_[Java教程]动态加载页面数据的小工具 javascript + jQuery (持续更新)...

    [Java教程]动态加载页面数据的小工具 javascript + jQuery (持续更新) 0 2014-05-07 18:00:06 使用该控件,可以根据url,参数,加载html记录模板(包含 ...

  9. confluence 编辑器这次没有加载_喵的Unity游戏开发之路 - 多场景:场景加载

    如果丢失格式.图片或视频,请查看原文:喵的Unity游戏开发之路 - 多场景:场景加载 很多童鞋没有系统的Unity3D游戏开发基础,也不知道从何开始学.为此我们精选了一套国外优秀的Unity3D游戏 ...

最新文章

  1. php学习,一个简单的Calendar(2) 一个简单的活动页面
  2. multi-mono-sf:自监督多帧单目场景流估计
  3. 一次有意义的51CTO沙龙归来
  4. jquery 加法 乘法运算 精确计算函数
  5. 怎么使用ajax重定向,如何通过在特定控制器和动作上使用Ajax调用来重定向用户...
  6. kettle 提交数据量_Kettle数据同步速度调优记录
  7. 微软系统工具套装(Windows Sysinternals Suite)
  8. 如何理解《信号与系统》?
  9. 关于idea,springboot启动最新版ibase4j报Unable to start ServletWebServerApplicationContext due to missing Serv
  10. 十大Excel函数(一)
  11. c语言实验内容设计思路,c语言实验报告书3.doc
  12. html5使用table制作表单
  13. 董宝珍:从股市总市值占GDP比例看本轮牛市的归宿
  14. Java-底层建筑-JVM-第3篇-StringTable
  15. 越权漏洞介绍和修复参考
  16. 数据湖与数据仓库:主要差异
  17. Shell脚本命令(长期更新)
  18. Typecho博客后台登录页面美化插件
  19. 鼎沐素食:还生命于自然,还身心于自己!
  20. 个人网站5-网站SEO优化推广和增加百度谷歌收录

热门文章

  1. 项目导入时报错:The import javax.servlet.http.HttpServletRequest cannot be resolved
  2. 如何将github上源代码导入eclipse中
  3. 抽象工厂模式(abstract factory)
  4. 命题思路或将转型,命题方向路在何方
  5. oracle 维护之Redo log file
  6. 动态链接库与静态链接库
  7. javascript实现缩略图
  8. Bitcoin.com| 比特币现金在澳大利亚的零售支出大幅超过BTC
  9. 使用Jekyll搭建博客
  10. 【面试】Java基础中的那些事-One