今晚看了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 泛型程序设计的更多相关文章

  1. Java基础语法<十二> 泛型程序设计

    1 意义 泛型程序设计意味着编写的代码可以被很多不同类型的对象所重用. 常见应用 : ArrayList 2 K T V E ? object等的含义 类型变量使用大写形式 E – Element ( ...

  2. Java核心技术第八章——泛型程序设计(1)

    1.泛型程序设计 泛型程序设计意味着编写的代码可以被很多不同类型的对象所重用.例如:不希望为了聚集String和Integer对象分别设计不同的类.(个人觉得此处说的聚集译为:创建一个对象,属性可以为 ...

  3. Java核心技术卷一基础知识-第12章-泛型程序设计-读书笔记

    第12章 泛型程序设计 本章内容: * 为什么要使用泛型程序设计 * 定义简单泛型类 * 泛型方法 * 类型变量的限定 * 泛型代码和虚拟机 * 约束与局限性 * 泛型类型的继承规则 * 通配符类型 ...

  4. C++学习笔记53:泛型程序设计与C++标准模板库

    泛型程序设计的基本概念 编写不依赖于具体数据类型的程序 将算法从特定的数据结构中抽象出来,成为通用的 C++模板为泛型编程程序设计奠定了关键的基础 模型:符合一个概念的数据类型称为该概念的模型,例如: ...

  5. Java核心技术-泛型程序设计

    使用泛型机制编写的代码要比那些杂乱地使用Object变量,然后再进行强制类型转换的代码具有更好的安全性和可读性. 泛型对于集合类尤其有用 1 为什么要使用泛型程序设计 泛型程序设计意味着编写的代码可以 ...

  6. 8、泛型程序设计与c++标准模板库1、泛型程序设计的概念和术语

    有效地利用已有的成果,将经典的.优秀的算法标准化.模块化,从而提高软件的生产率,是软件产业化的需求,为了实现这一需求,不仅需要面向对象设计思想,而且需要泛型程序设计思想. c++语言提供的标准模板库( ...

  7. C++ 泛型程序设计与STL模板库(1)---泛型程序设计简介及STL简介与结构

    泛型程序设计的基本概念 编写不依赖于具体数据类型的程序 将算法从特定的数据结构中抽象出来,成为通用的 C++的模板为泛型程序设计奠定了关键的基础 术语:概念 用来界定具备一定功能的数据类型.例如: 将 ...

  8. javaSE复习之——线程

    线程其实就是程序执行的一条路径,一个进程中可以包含多条线程,多线程并发执行可以提高程序效率,可以同使完成多项任务 多线程的应用场景 迅雷多线程一起下载 服务器同时处理多个客户请求 多线程原理(单核CP ...

  9. JavaSE复习总结之集合(Collection)

    Java早期版本只给集合类库提供了很少的一组类,但是随着Java版本的升级,Java集合类库越来越充实.集合类库里面存放的,是各式各样的数据容器,我们基本都学过数据结构这门课,数据结构所讲的就是ADT ...

随机推荐

  1. MS Sq l数据类型

    一.nchar : 适用于西文字符,一个字符占一个字节. 二.char: 可以中文,一个字符占两个字节. 三.var :可变. 四.varchar.nvarchar . 所以一般来说,如果含有中文字符 ...

  2. 各种drawable

    BitmapDrawable   可以把小图片平铺布满布局来设置背景. PictureDrawable    记录绘制过程 ClipDrawable     裁剪   进度条 InsetDrawabl ...

  3. ACM题目————STL练习之众数问题

    描述 所谓众数,就是对于给定的含有N个元素的多重集合,每个元素在S中出现次数最多的成为该元素的重数, 多重集合S重的重数最大的元素成为众数.例如:S={1,2,2,2,3,5},则多重集S的众数是2, ...

  4. mybatis+springMVC新感悟

    一直以为按照例子里写的.先编写User实体类,之后在编写User.xml之后在配置文件里指明接口文件.然后在controller中就可以通过就可以通过定义接口,在取值 IUserOperation u ...

  5. Friendship

    Friendship Time Limit: 2000MS Memory Limit: 20000K Total Submissions: 9824 Accepted: 2720 Descriptio ...

  6. web和winform的MD5加密

    MD5加密,web和winform Web /// <summary> /// 获取获取MD5加密后字符串 /// </summary> /// <param name= ...

  7. UML实践详细经典教程----用例图、顺序图、状态图、类图、包图、协作图

    面向对象的问题的处理的关键是建模问题.建模可以把在复杂世界的许多重要的细节给抽象出.许多建模工具封装了UML(也就是Unified Modeling Language™),这篇课程的目的是展示出UML ...

  8. 2015年江西理工大学C语言程序设计竞赛(初级组)

    JankTao相亲记 解法:排序 #include<stdio.h> #include<string.h> #include<iostream> #include& ...

  9. C语言使用fread和fwrite处理任何文件

    1.文件必须以二进制形式打开 FILE* pfile1=fopen("fileone","rb"); FILE* pfile2=fopen("file ...

  10. C#String详解

    字符串:stringLength - 字符串的长度. TrimStart() 压缩空格即消除字符串开始空格TrimEnd() 消除结尾空格Trim() 同时消除开头和结尾空格.注:中间空格不消除,因为 ...