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 ...
随机推荐
- ACM题目————棋盘问题
Description 在一个给定形状的棋盘(形状可能是不规则的)上面摆放棋子,棋子没有区别.要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列,请编程求解对于给定形状和大小的棋盘,摆放k个棋子 ...
- WIN7 64位系统注册银行支付组件
WIN7 64位系统注册银行支付组件目前只尝试注册了银联的chinapay.dll和工行的icbcebankutil.dll 1.将dll文件拷贝到windows\syswow64\文件夹下(Win7 ...
- python-django 模型model字段类型说明
V=models.CharField(max_length=None<, **options>) #varchar V=models.EmailField(<max_length=7 ...
- .Uva&LA部分题目代码
1.LA 5694 Adding New Machine 关键词:数据结构,线段树,扫描线(FIFO) #include <algorithm> #include <cstdio&g ...
- Python学习笔记-Day2-Python基础之列表操作
列表的常用操作包括但不限于以下操作: 列表的索引,切片,追加,删除,切片等 这里将对列表的内置操作方法进行总结归纳,重点是以示例的方式进行展示. 使用type获取创建对象的类 type(list) 使 ...
- Less/Sass编译工具
less中午网站有详细的说明:http://www.1024i.com/demo/less/ 那里我使用的koala 全平台支持,国产.下载地址:http://koala-app.com/inde ...
- Java提高篇---Map总结
一.Map概述 首先先看Map的结构示意图 Map:"键值"对映射的抽象接口.该映射不包括重复的键,一个键对应一个值. SortedMap:有序的键值对接口,继承Map接口. Na ...
- wpfのpack协议
当引用的资源需要做成dll时,要用此协议 协议:pack:// 授权:有两种.一种用于访问编译时已经知道的文件,用application:///.一种用于访问编译时不知道.运行时才知道的文件 ...
- 推荐一款非常棒的谷歌插件---快速查看HTML页面元素的CSS样式
一.下载地址 http://chromecj.com/web-development/2015-05/456/download.html 二.简介 CssViewer是一款快速查看当前页面元素的CSS ...
- linux修改文件所属用户和组
使用chown命令可以修改文件或目录所属的用户: 命令:chown 用户 目录或文件名 例如:chown qq /home/qq (把home目录下的qq目录的拥有者改为qq用户) 使用chgrp命 ...