关于Java泛型的新解
////////////////////////////////////////////////////////////////////////////////为了方便您的观看,请在web版式视图在观看本文章。//////////////////////////////////////////////////////////////////////////////////////////////
《关于泛型》
-----------------------------------à入门泛型的基本应用
$1.体验泛型
泛型是JDK1.5的所有新特性中最难深入透彻掌握的部分。不过,我们在实际应用中不能掌握得那么深入,掌握泛型中一些最基本的内容就差不多了。没有使用泛型时,只要是对象,不管是什么类型的对象,都可以存储进同一个集合中。使用泛型集合,可以将一个集合的元素限定为一个特定类型,集合中只能存储同一个类型的对象。这样就更加安全,并且在从集合中获取一个对象的时候,编译器也可以知道这个对象的类型,不需要对对象进行强制转换。这样使得程序员更加方便。
※ JDK1.5以前的集合类中存在什么问题?
※ JDK1.5的集合类型希望在定义集合的时候,明确表示要向集合中装哪种类型的数据,无法加入指定类型以外的数据。
※ 泛型是提供给javac编辑器使用的,可以限定集合中的输入类型,让编译器挡住源程序的非法输入,编译器编辑带类型说明的集合时,会去除掉‘类型’信息。使程序运行的效果不受到影响,对于参数化的泛型类型,getClass()方法返回值和原始类型是完全一样的。由于编译生成的字节码会去除掉泛型的类型信息,只要能跳过编译器,就可以往某个泛型集合中加入其他类型的数据。例如:用反射得到集合,再调用其他add()方法即可。
$2.泛型的内部原理及应用(更深层级理解)
※ 了解泛型
○ArrayList<E>类定义和ArrayList<Integer>类引用中涉及到的术语有如下:
□整个称ArrayList<E>为 泛型类型。
□ArrayList<E>中的E称为 类型变量或者类型参数
□整个ArryList<Integer>称为 参数化的类型。
□ArrayList<Integer>中的Integer称为 类型参数的实例或者实例参数。
□ArratList<Integer>中的 <> 读作 typeof。
□ArrayList成为原始类型。
※ 参数化类型与原始类型的兼容性
○参数化的类型可以引用一个原始类型的对象,编译会报告警告,例如:
○原始类型可以引用一个参数化的类型,编译会报告错误,例如:
○参数化类型不考虑类型参数的继承关系。
○在创建数组实例时,数组元素是不能使用参数化的类型的,例如:
○思考下列的代码是否会报错?
$2.泛型的通配符扩展应用
※ 泛型中的 ? 通配符
○问题: 定义一个方法:该方法用于打印任意参数类型的集合中的所有资源,该方法该如何去定义呢?
▼错误方式:
▼正确方式:
○总结:
使用 ? 通配符可以引用其他各种参数化的类型,?通配符定义的变量主要用作引用,可以调用与参数化无关的方法,不能调用与参数化有关的方法。
※ 泛型中的 ? 通配符 的扩展
○限定通配符的上边界。
▼正确方式:
▼错误方式:
○限定通配符的下边界。
▼正确方式:
▼错误方式:
○提示:
◆限定通配符总是包括自己的。
----------------------------------------------------------------------------
$3.泛型集合的综合案例。
○能写出下面的代码即 代表 已经掌握了java的泛型基本类:
○对在jsp页面中也经常要对Set或者Map集合进行迭代:
$4.自定义泛型方法及其应用
○由C++的模板函数引入自定义泛型
◆如下函数的结构很相似,仅类型不同
◆C++模板函数解决,只写一个通用的方法,它可以适应各种类型,示意代码如下:
○java中的泛型类型(或者泛型)类似于C++中的模板。但是这种相似性仅限于表面。Java语言中的泛型基本上是完全在编译器中实现, 用于编译器执行类型检查和类型判断,然后生成普通的非泛型的字节码。这种实现技术被称为擦除(erasure)(编译器使用泛型信息保证类型安全,然后再生成字节码之前将其清除)。 这是因为扩展虚拟机指令集来支持泛型被认为是无法接受的,这会为java厂商升级其JVM造成难以逾越的障碍。所以,java的泛型采用了可以完全在编译器中实现的擦除方法。
例如:下面的这两种方法,编译器会报告错误,它不认为是两个不同的参数类型,而认为是同一种参数类型,所以不能做到 方法的重载。
$5.定义泛型方法
○java的泛型方法没有C++模板函数功能强大,java的如下代码是无法通过编译的:
关于Java泛型的新解的更多相关文章
- Java泛型的历史
为什么Java泛型会有当前的缺陷? 之前的章节里已经说明了Java泛型擦除会导致的问题,C++和C#的泛型都是在运行时存在的,难道Java天然不支持“真正的泛型”吗? 事实上,在Java1.5在200 ...
- 浅析Java 泛型
泛型是JavaSE5引入的一个新概念,但是这个概念在编程语言中却是很普遍的一个概念.下面,根据以下内容,我们总结下在Java中使用泛型. 泛型使用的意义 什么是泛型 泛型类 泛型方法 泛型接口 泛型擦 ...
- Java:泛型基础
泛型 引入泛型 传统编写的限制: 在Java中一般的类和方法,只能使用具体的类型,要么是基本数据类型,要么是自定义类型.如果要编写可以应用于多种类型的代码,这种刻板的限制就会束缚很多! 解决这种限制的 ...
- java泛型基础
泛型是Java SE 1.5的新特性, 泛型的本质是参数化类型, 也就是说所操作的数据类型被指定为一个参数. 这种参数类型可以用在类.接口和方法的创建中, 分别称为泛型类.泛型接口.泛型方法. Ja ...
- 使用java泛型设计通用方法
泛型是Java SE 1.5的新特性, 泛型的本质是参数化类型, 也就是说所操作的数据类型被指定为一个参数. 因此我们可以利用泛型和反射来设计一些通用方法. 现在有2张表, 一张user表和一张stu ...
- 关于Java泛型的使用
在目前我遇到的java项目中,泛型应用的最多的就属集合了.当要从数据库取出多个对象或者说是多条记录时,往往都要使用集合,那么为什么这么使用,或者使用时有什么要注意的地方,请关注以下内容. 感谢Wind ...
- 初识java泛型
1 协变数组类型(covariant array type) 数组的协变性: if A IS-A B then A[] IS-A B[] 也就是说,java中的数组兼容,一个类型的数组兼容他的子类类型 ...
- 【Java心得总结四】Java泛型下——万恶的擦除
一.万恶的擦除 我在自己总结的[Java心得总结三]Java泛型上——初识泛型这篇博文中提到了Java中对泛型擦除的问题,考虑下面代码: import java.util.*; public clas ...
- 【Java心得总结三】Java泛型上——初识泛型
一.函数参数与泛型比较 泛型(generics),从字面的意思理解就是泛化的类型,即参数化类型.泛型的作用是什么,这里与函数参数做一个比较: 无参数的函数: public int[] newIntAr ...
随机推荐
- C#的FTP上传下载的实验
前段时间做了一个FTP操作服务器文件的实验,现在把一些经验写下来,免得忘记. 1.上传的处理:目标文件夹A上传到服务器指定目录.先检索服务器目录中有无同名文件夹,若有,则先改名,上传成功后再删除,上传 ...
- 结构-行为-样式-Css笔记
0.常见的行级元素和块级元素: 行级元素:div,table,form ,ul,ol,p,h1-h6,hr; 块级元素:a,select,input,textarea,img,label,br,i, ...
- C++ 头文件系列(queue)
简介 这个头文件定义了两个跟队列有关的类----quque.priority_queue,分别实现的是队列 和 优先队列这两个概念. 但是与这两个类模版与其它类模版(vector.array等)最大的 ...
- 集中式(CVS、SVN)VS分布式(Git)
集中式版本控制系统,版本库是集中存放在中央服务器的,而干活的时候,用的都是自己的电脑,所以要先从中央服务器取得最新的版本,然后开始干活,干完活了,再把自己的活推送给中央服务器.中央服务器就好比是一个图 ...
- 实际开发中,后台回传的错误格式的Json数据处理
现在很多学习刚学习移动开发的同学,相信在培训机构,拿到后台数据的时候,格式都是正确的,甚至有的还是plist文件.但是实际开发中,我们获取数据都是通过网络接口从服务器获取数据,这些数据的格式都是后台写 ...
- Santa Claus and Tangerines
Santa Claus and Tangerines 题目链接:http://codeforces.com/contest/752/problem/E 二分 显然直接求答案并不是很容易,于是我们将其转 ...
- Centos 7 意外断电如何处理
拔U盘的时候,不小心碰到了主机上的开机键-- 还好默认的响应动作是睡眠-- 还不知道 CentOS 怎么样应对意外断电呢?!
- 如何用php开启企业微信开发的回调模式
猜想: 懵逼 实践: 微信公众号开发的手册中甚至给出了只需要修改几个参数就能使用的范例.企业微信开发中在一个很不显眼的地方放了一个sample. https://work.weixin.qq.com/ ...
- 关于react-native遇到Can't find variable: TouchableHighlight
当你遇到这样的问题时,是由于你没有import中添加TouchableHighlight import { AppRegistry, StyleSheet, Text, View, PixelRati ...
- 诡异的数学,数字问题 - leetcode
134. Gas Station 那么这题包含两个问题: 1. 能否在环上绕一圈? 2. 如果能,这个起点在哪里? 第一个问题,很简单,我对diff数组做个加和就好了,leftGas = ∑diff[ ...