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 ...
随机推荐
- 如何生成excel文件作为图像识别结果
如何生成excel文件作为图像识别结果 在进行大规模图像处理的时候,如果能够以表格的形式生成结果文件,将非常的直观.这个时候,选择excel作为结果输出文件,将是合适的. 查询相关资料,有很多关于ex ...
- oracle闪回查询
一.引言 程序中用到需要同步oracle更新和删除数据,于是考虑利用oracle的闪回查询机制来实现. 利用该机制首先需要oracle启用撤销表空间自动管理回滚信息,并根据实际情况设置对数据保存的有效 ...
- volatile关键字解析
转载:http://www.cnblogs.com/dolphin0520/p/3920373.html volatile这个关键字可能很多朋友都听说过,或许也都用过.在Java 5之前,它是一个备受 ...
- 操作SQLite的dbhelper
操作SQLite的dbhelper public class DbHelper { string connStr = @"Data Source=" + System.Enviro ...
- 2016CCPC东北地区大学生程序设计竞赛 1003 HDU5924
链接http://acm.hdu.edu.cn/showproblem.php?pid=5924 题意:根据公式求C,D 解法:打表找规律 #include <bits/stdc++.h> ...
- mysql分库分表
1.分库分表 很明显,一个主表(也就是很重要的表,例如用户表)无限制的增长势必严重影响性能,分库与分表是一个很不错的解决途径,也就是性能优化途径,现在的案例是我们有一个1000多万条记录的用户表mem ...
- eclipse 智能提示
eclipse 智能提示 1.显示行号 2.android 的xml提示 文本框的内容为: <=:.abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTU ...
- CodeForces 651C Watchmen map
Watchmen are in a danger and Doctor Manhattan together with his friend Daniel Dreiberg should warn t ...
- SqlSever基础 group by之后,加having 对分组之后的数据在进行处理
镇场诗:---大梦谁觉,水月中建博客.百千磨难,才知世事无常.---今持佛语,技术无量愿学.愿尽所学,铸一良心博客.------------------------------------------ ...
- Linux下指定版本编译安装LAMP
说明: 操作系统:CentOS 6.5 64位 需求: 编译安装LAMP运行环境 各软件版本如下: MySQL:mysql-5.1.73 Apache:httpd-2.2.31 PHP:php-5.2 ...