- 浏览: 1682236 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (335)
- uml (11)
- java (318)
- python (11)
- socket (2)
- ant (1)
- data structures (58)
- algorithms (67)
- concurrency (16)
- multithreading (16)
- mysql (2)
- ubuntu (2)
- c语言 (1)
- lucene (0)
- elasticsearch (0)
- django (1)
- 读书 观点 (2)
- 读书 (4)
- 观点 (4)
- collections (8)
- nio (1)
- io (2)
- 系统集成 (1)
- activemq (2)
- restful (0)
- web service (0)
- HttpClient (1)
- serializable (0)
- annotation (1)
- jdbc (3)
- classloader (0)
- regular expression (1)
- jpa (4)
- jvm (0)
- reflection (1)
- commons-pool2 (2)
- javamail (1)
- velocity (1)
- mathematics (3)
- graph (13)
- LeetCode (159)
- scala (0)
- spring (24)
- maven (5)
- spring batch (1)
- quartz (2)
- IOC (2)
- ORM (3)
- hibernate (2)
- aop (4)
- redis (0)
- zookeeper (0)
- spring mvc (4)
- ELK (1)
- string (1)
- gradle (1)
- mybatis (5)
- docker (0)
- servlet (0)
- log4j2 (1)
- html (0)
- css (0)
最新评论
-
nucleus:
貌似是因为图片的路径是http的缘故:http://dl2.i ...
spring container 实现分析:BeanWrapper -
nucleus:
nucleus 写道BeanWrapper这一块相关的类结构如 ...
spring container 实现分析:BeanWrapper -
nucleus:
BeanWrapper这一块相关的类结构如下图:文中提到的上述 ...
spring container 实现分析:BeanWrapper -
leshy:
inventory.sort(Comparator.compa ...
java8 lambda表达式学习总结 -
Leisurez:
di1984HIT 写道xuexile~hahaha~
activemq的几种基本通信方式总结
置换原则
结合Java本身的一些面向对象的特性,我们很容易理解这么一个置换原则:
一个指定类型的变量可以被赋值为该类型的任何子类;一个指定某种类型参数的方法可以通过传入该类型的子类来进行调用。
总的来说,就是说我们使用的任何类型变量都可以用该类型的子类型来替换。
泛型中一种错误的继承关系
在泛型的编程中,我们考虑到子类型关系的时候,容易把一种关系给弄混淆,并错误的采用置换原则。
比如说:
List<Integer> ints = new ArrayList<Integer>(); ints.add(1); ints.add(2); List<Number> nums = ints; // compile error
在这段代码中,我们看到类型参数Integer是Number的子类型,就容易想当然的认为List<Integer>也是List<Number>的子类。实际上并不是。所以才会导致类型不匹配,产生编译时错误。
有点时候,我们觉得,这样的转换看似不能用到一个好处,就是利用对象之间继承的关系。要是我们能有一个列表,它既能处理某种类型的数据,还能处理该类型的所有子类型的数据,这样岂不是既能用到泛型的好处又可以用到对象关系的好处么?于是在这里就引出了通配符(wildcard)。
通配符(Wildcard)
在Java类库中Collection接口定义中有一个用到通配符的方法:
interface Collection<E> { ... public boolean addAll(Collection<? extends E> c); ... }在addAll方法的描述里,可以接受Collection类型的参数。其中Collection中的类型参数可以为任何继承E的子类型。
因此,我们可以在实际代码中这么使用:
List<Number> nums = new ArrayList<Number>(); List<Integer> ints = Arrays.asList(1, 2); List<Double> dbls = Arrays.asList(2.78, 3.14); nums.addAll(ints); nums.addAll(dbls);
在代码中我们可以看到,List<Integer>和List<Double>都是Collection<? extends Number>类型的子类。所以上面的方法中可以将Integer和Double两种类型的List传入到方法中。
通配符使用限制1:
使用通配符的泛型数据类型比较有意思,既然前面我们可以将其作为方法声明的参数,那么是否可以将它作为一个变量类型来直接创建变量呢?
看如下代码:
List<? extends Number> nums = new ArrayList<Integer>(); //compile error实际上上面这段代码是编译通不过的。
通配符使用限制2:
既然不能用来直接创建变量对象,那么再看下面这段代码:
List<Integer> ints = new ArrayList<Integer>(); ints.add(1); ints.add(2); List<? extends Number> nums = ints; nums.add(3.14); // compile error
这段代码的第5行会导致编译错误。在第4行代码中,我们将ints赋值给nums,表面上nums声明为一个List<Integer>的父类型,所以第4行编译正常。为什么第5行代码会出错呢?表面上看来,既然nums类型可以接受继承自Number的所有参数,那加一个Double类型的数据应该是没问题的。实际上我们再考虑一下这样会带来的问题:
nums本来引用的是一个继承自该类型的List<Integer>,如果我们允许加入Double类型的数据的话,那么ints这个Integer的List里面就包含了Double的数据,当我们使用ints的时候,和我们所期望的只包含Integer类型的数据不符合。
因此,这段代码也说明了一个问题,就是在? extends E这种通配符引用的数据类型中,如果向其中增加数据操作的话会有问题。所以向其中增加数据是不允许的。但是我们可以从其中来读取数据。
总结:
1:通配符修饰的泛型不能用来直接创建变量对象。
2:通配符修饰相当于声明了一种变量,它可以作为参数在方法中传递。这么做带来的好处就是我们可以将应用于包含某些数据类型的列表的方法也应用到包含其子类型的列表中。相当于可以在列表中用到一些面向对象的特性。
ps:
实际上通配符的使用既包括? extends也包括? super的应用。累了,下回继续更新:)
发表评论
-
spring源代码分析:aop的实现
2018-10-03 23:32 740简介 在之前的文章里我们讨论过一些程序构建Pro ... -
java annotation基础
2018-06-30 16:41 887简介 之前有一篇简短的文章讨论过annotati ... -
spring源代码分析:annotation支持的实现
2018-09-03 23:31 2555简介 在之前的文章里,我们讨论了spring I ... -
spring container 实现分析:BeanFactory and ApplicationContext
2018-06-02 18:29 1473简介 在之前的文章里,我们讨论过作为spring ... -
spring aop: ProxyFactory
2018-04-30 16:45 842简介 在之前的文 ... -
日志与log4j2的配置和应用总结
2018-02-15 15:47 12322简介 通常我们在日常的应用开发中,日志起到一个非 ... -
Java servlet学习总结
2018-01-02 21:14 0简介 应用系统架构的演化(从CS到BS) ... -
spring container 实现分析:BeanWrapper
2018-02-19 18:10 1985简介 在之前的一篇文章里, 我们基于《Exper ... -
spring propertyeditor
2017-10-26 09:17 0pro spring 5 chapter 4, page ... -
spring bean life cycle
2018-02-25 13:30 930简介 在使用spring bean的过程中,有一个 ... -
spring container的设计与实现分析
2017-10-08 21:31 2776简介 在之前的一 ... -
jdbc数据访问的封装和演化
2017-09-16 17:00 2694简介 在使用传统jdbc的方式来访问数据的时候, ... -
Boyer Moore算法分析总结
2017-03-31 18:42 3558简介 在之前的文章里,对于字符串的搜索算法,我曾 ... -
mybatis学习总结:mybatis和spring, spring boot的集成
2017-03-04 18:07 2512简介 在前面的讨论里已经提到了mybatis的各种配置 ... -
mybatis学习总结:annotation与xml结合示例
2017-02-25 21:09 3708简介 在之前的文章里讨论过mybatis纯xml或者 ... -
mybatis学习总结:对象关系映射的xml配置实现
2017-02-19 23:03 4067简介 在之前的文章里已经讨论过mybatis的基本配 ... -
mybatis学习总结:annotation示例改进
2017-01-24 09:06 3445简介 在前一篇文 ... -
mybatis学习总结:基础示例
2017-01-21 23:30 901简介 mybatis是一个比较流行的ORM框架, ... -
gradle学习总结
2016-12-18 21:01 4633简介 Java的自动化构建工具比较多,从最开始的an ... -
String sort的几种方法
2016-10-16 23:07 2191简介 在之前的一 ...
相关推荐
通过深入理解和熟练应用Java泛型,开发者可以编写出更健壮、可维护的代码,减少潜在的类型错误,提高代码质量。对于阅读给定的“generic.pdf”文档,可以期待更详细的泛型用法示例、最佳实践和深入解析。
在Java编程语言中,泛型(Generic)是一个强大的特性,它允许我们在编译时检查类型安全,并且可以消除运行时的类型转换。泛型引入的主要目的是提高代码的重用性、安全性和效率,同时减少类型转换的繁琐工作。这篇...
标题中的"Generic_MT4_java_generic_mt4_"暗示了一个与MetaTrader 4 (MT4)交易平台相关的编程项目,可能是一个自定义的智能交易系统(Expert Advisor,EA)或指标,使用了Java语言,并且具有通用性。这个“Generic_...
Java1.5泛型指南中文版(Java1.5 GenericTutorial)
Generic Variance java 源码
Generic Stack java 源码
在《java-generic.rar》压缩包中包含的《java generic.pdf》文件,很可能是详细阐述了以下几个关于Java泛型的核心知识点: 1. **类型参数化**:泛型的核心在于类型参数化,这使得我们可以在定义类、接口和方法时...
### 泛型编程在科学计算中的应用:C++、Java与C#的比较 #### 摘要概览 本文是一篇关于泛型编程在科学计算领域应用的研究论文。研究对比了Java、C#和C++三种语言在实现泛型(参数化类型)方面的表现,并重点介绍了...
这个描述虽然简洁,但我们可以从中推测出几个关键知识点: 1. **硬件兼容性**:"Generic Generic 16BW-5"可能是一个具有广泛兼容性的硬件设备,可能是打印机、扫描仪、网络适配器或其他类型的外设。"Generic"这个词...
通过上述讨论,我们可以得出以下几点结论: 1. **泛型数组的创建**:在 Java 中,直接创建泛型数组是不可能的,而应当采用 `Array.newInstance` 或其他替代方案。 2. **类型擦除的影响**:Java 泛型在运行时会被擦除...
java高手真经 全光盘源代码 打包rar 第1部分(2个程序包) HelloWorld.zip 01.Java入门样例Hello...javageneric.zip 27.Java泛型编程 javaannotation.zip 28.Java注释符编程 javafeature.zip 29.Java5.0语言新特性
C语言头文件 GENERICC语言头文件 GENERICC语言头文件 GENERICC语言头文件 GENERICC语言头文件 GENERICC语言头文件 GENERICC语言头文件 GENERICC语言头文件 GENERICC语言头文件 GENERICC语言头文件 GENERICC语言...
### Java泛型编程详解 #### 引言 Java 5引入了多项语言级别的扩展功能,其中最为重要的一项就是泛型(Generics)的引入。本文档旨在为读者介绍Java中的泛型概念及其用法。 如果你熟悉其他语言如C++中的模板...
标题中的"generic 22bw1"可能是指一个软件或者硬件产品的版本标识,其中"generic"通常代表通用或标准的意思,而"22bw1"可能是这个产品版本的特定编号或者代号,可能是为了区分不同的迭代或者更新。在IT行业中,这种...
如果"Generic22BW"是应用程序,它可能涵盖各种IT领域的知识点。比如,它可能是一个基于Web的应用,涉及HTML、CSS、JavaScript等前端技术,以及Node.js、Python或PHP等后端语言。如果是移动应用,那么它可能涉及到...
11.4java-泛型(Generic)
本文将深入探讨“打印机驱动Generic 22BW”,特别是针对震旦品牌的打印机,包括Generic 16/21/22型号的相关知识点。 首先,我们要理解什么是“Generic”驱动。在打印机驱动中,“Generic”通常指的是通用驱动程序。...