JavaSE复习_8 泛型程序设计
今晚看了core Java的泛型部分,万万没有想到,当时看培训班视频入门的一带而过的泛型,有这样多的细节,整理了一下书里面提到的一些自认为的重点,方便以后观阅.由于是复习,一些基础知识跳过.
△泛型类型的限定:即<T extends Comparable>类型,T为绑定类型的子类型,而一个类型的变量或者通配符可以有多个限定,例如<T extends Comparable&Serializable>
△Java中实现泛型机制是通过类型擦除来保证的,有给定限定用第一个限定的类型变量来替换,没有给定限定用Object来替换.
△在牵扯到特定类型的返回时,编译器会自动添加类型转换,来保证类型的匹配.对此虚拟机一无所知.
△Java在翻译泛型方法的时候,会带来一些问题,例如,如果父类泛型类为Pair<T> 内部有方法public void set(T t).那么假设子类DateInterval继承父类Pair<Date>重写为public void set(Date d).这时候将父类引用指向子类对象的时候,就会发生问题,本意是让子类对象去覆盖父类的方法,但是由于泛型的擦除,父类的方法变为public void set(Object t),这时候就无法覆盖了.实际上,子类里包含两个方法,从父类继承的public void set(Object o),和子类准备重写的public void set(Date d).这时候,就会产生问题.实际上,聪明的编译器在DateInterval extends Pair<Date>被擦除变为DateInterval extends Pair的时候,会在子类增加一个方法,这个方法被称为桥接方法.桥接方法覆盖了Object方法,其格式为:public void set(Object o){set((Date)o)}.实际上,桥接方法一般情况下只能存在一个,因此下面的代码是非法的:
class Calendar implements Comparable<Calendar>{}
class GregorianCalendar extends Calendar implements GregorianCalendar<GregorianCalendar>{}
因为有可能与合成的桥方法产生冲突.总而言之,需要注意的是:虚拟机没有泛型只有标准的类和方法,桥方法被合成以保持多态.
△运行时的类型查询只适用于原始类型.例如instance of为一个运行时查询的关键字,那么a instance of Pair<T>仅仅测试a是否是一个任意类型的Pair.同样的道理,getclass返回运行时类型:
Pair<String> stringPair=...;
Pair<Employee> emPair=...;
if(stringPair.getClass()==emPair.getClass())//true,两者相等
△泛型类的静态上下文中声明在类上的类型变量无效.例如下面的例子是错误的:
class Demo<T> {
public static T get(){}
}
但是,声明在静态方法上的变量可以正常使用:
public static <T> T get(){} //正确
△通配符<? extends Comparable>代表任意子类,因此可以用父类来接收,但是不能往里面增加元素,简称为get原则,通配符<? super Demo>代表任意父类,因此可以往里面添加子类元素,但是无法从内部获取元素,因为不确定是什么父类,即Put原则.典型通配符的运用<T extends Comparable<? super T>>代表T实现了Comparable接口,Comparable接口是用其父类元素作比较的.
JavaSE复习_8 泛型程序设计的更多相关文章
- Java基础语法<十二> 泛型程序设计
1 意义 泛型程序设计意味着编写的代码可以被很多不同类型的对象所重用. 常见应用 : ArrayList 2 K T V E ? object等的含义 类型变量使用大写形式 E – Element ( ...
- Java核心技术第八章——泛型程序设计(1)
1.泛型程序设计 泛型程序设计意味着编写的代码可以被很多不同类型的对象所重用.例如:不希望为了聚集String和Integer对象分别设计不同的类.(个人觉得此处说的聚集译为:创建一个对象,属性可以为 ...
- Java核心技术卷一基础知识-第12章-泛型程序设计-读书笔记
第12章 泛型程序设计 本章内容: * 为什么要使用泛型程序设计 * 定义简单泛型类 * 泛型方法 * 类型变量的限定 * 泛型代码和虚拟机 * 约束与局限性 * 泛型类型的继承规则 * 通配符类型 ...
- C++学习笔记53:泛型程序设计与C++标准模板库
泛型程序设计的基本概念 编写不依赖于具体数据类型的程序 将算法从特定的数据结构中抽象出来,成为通用的 C++模板为泛型编程程序设计奠定了关键的基础 模型:符合一个概念的数据类型称为该概念的模型,例如: ...
- Java核心技术-泛型程序设计
使用泛型机制编写的代码要比那些杂乱地使用Object变量,然后再进行强制类型转换的代码具有更好的安全性和可读性. 泛型对于集合类尤其有用 1 为什么要使用泛型程序设计 泛型程序设计意味着编写的代码可以 ...
- 8、泛型程序设计与c++标准模板库1、泛型程序设计的概念和术语
有效地利用已有的成果,将经典的.优秀的算法标准化.模块化,从而提高软件的生产率,是软件产业化的需求,为了实现这一需求,不仅需要面向对象设计思想,而且需要泛型程序设计思想. c++语言提供的标准模板库( ...
- C++ 泛型程序设计与STL模板库(1)---泛型程序设计简介及STL简介与结构
泛型程序设计的基本概念 编写不依赖于具体数据类型的程序 将算法从特定的数据结构中抽象出来,成为通用的 C++的模板为泛型程序设计奠定了关键的基础 术语:概念 用来界定具备一定功能的数据类型.例如: 将 ...
- javaSE复习之——线程
线程其实就是程序执行的一条路径,一个进程中可以包含多条线程,多线程并发执行可以提高程序效率,可以同使完成多项任务 多线程的应用场景 迅雷多线程一起下载 服务器同时处理多个客户请求 多线程原理(单核CP ...
- JavaSE复习总结之集合(Collection)
Java早期版本只给集合类库提供了很少的一组类,但是随着Java版本的升级,Java集合类库越来越充实.集合类库里面存放的,是各式各样的数据容器,我们基本都学过数据结构这门课,数据结构所讲的就是ADT ...
随机推荐
- python: html 笔记2
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- android应用程序中获取view 的位置
1. 相对位置: getLeft() , getRight(), getTop(), getBottom() 在Android中可以把left相当于X轴值, top相当于Y轴值, 通过这两个值Andr ...
- IoC容器概述
IoC(Inverse of Control: 控制反转)是spring容器的内核, 字面意思是: 控制反转, 包含两个内容:(1) 控制, (2) 反转.那到底是什么东西的控制被反转了呢? 对于软件 ...
- jquery uploadify上传插件兼容火狐问题
jquery uploadify长传插件兼容火狐问题.因为现在火狐以不在默认安装flash插件.所以uploadify的flash版就需要安装flash插件.还可以成功. 可以到哪里下载安装:http ...
- 一次Linux系统被攻击的分析过程
IT行业发展到现在,安全问题已经变得至关重要,从最近的“棱镜门”事件中,折射出了很多安全问题,信息安全问题已变得刻不容缓,而做为运维人员,就必须了解一些安全运维准则,同时,要保护自己所负责的业务,首先 ...
- Android 进度条
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android=&quo ...
- Sql合并两个select查询
现有2个查询,需要将每个查询的结果合并起来(注意不是合并结果集,因此不能使用union),可以将每个查询的结果作为临时表,然后再从临时表中select所需的列,示例如下: SELECT get.d ...
- SQL判断汉字
/* unicode编码范围: 汉字:[0x4e00,0x9fa5](或十进制[19968,40869]) 数字:[0x30,0x39](或十进制[48, 57]) 小写字母:[0x61,0x7a]( ...
- Mysql错误问题记录
① Incorrect string value: '\xE6\x94\xBE\xE5\xA4\xA7...' for column 'name' at row 1 Query…… 原因:编码不匹配. ...
- Spring整合Tiles
1.假设Spring相关的包和配置已经导入成功(后续有时间补上,本项目用的是3.2.0版本). 2.导入Tiles相关的jar包. tiles-api-2.2.2.jar tiles-core-2.2 ...