先发布,以后有空再修改。。。

第一次看到《java核心技术卷一》中关于泛型这部分的时候感觉很复杂,似乎有说不完的约束条件,让人难以理解。当时只是囫囵吞枣般过了一遍,也没有看出个什么来。现在是时候回过头来认真学习学习这方面的知识啦。在这里记录一下JAVA泛型中比较难理解的部分。

泛型表达式的类型擦除

按照书中的例子:

class Pair<T>{
public Pair(){
first=null;
second=null;
}
public Pair(T _first,T _second){
first=_first;
second=_second;
}
public void setFirst(T _first){
first=_first;
}
public void setSecond(T _second){
second=_second;
}
public T getFirst(){
return first;
}
public T getSecond(){
return second; }
public String toString(){
return "First:" +first + "\tSecond:"+second; }
private T first;
private T second;
}

书中提到:虚拟机中是没有泛型类型对象——所有对象都属于普通类。也就是说经过编译之后的字节码文件中是没有“泛型”这个概念的。

因为T是一个无限定的变量,所以上面的代码中的类型T,可以直接用Object来代替,Object是所有类的超类。无论是Pair<String>或者Pair<Integer>,编译后,它们都将变成Pair<Object>

如果类型限定是多个接是多个接口,如果下面的例子:

public class Interval<T extends Comparable & Serializable>{
public Interval(T first,T second){
if(first.compareTo(second)<=0){lower=first;upper=second;}
else {lower=second;upper=first;}
}
...
private T lower;
private T upper;
}

那么编译器在编译的时候,是按接口出现的顺序来进行替换的。如上面,类型T将会被用Comparable来替换。如果要用到类型的Serializable接口的时候,编译会在对应的地方加入强制转换语句。同样,如果限定为: T extends Serializable & Comparable的话,类型T将会被用Serializable来替换。因此,作者说了,为了提高效率,应该将标签接口(没有方法的接口,比如Cloneable)放在边界列表的末尾。

作者还提到编译在处理(翻译)泛型表达式的时候的一些细节问题:

当程序调用泛型方法时,如果擦除返回类型,编译器插入强制类型转换。例如:

Pair<Employee> buddies=...;
Employee buddy=buddies.getFirst();

擦除类型之后将返回Object类型(假设类型T是没有限定的),编译器自动插入Employee的强制类型转换,也就是说,编译器把这个方法的调用翻译成了两条虚拟机指令:

Employee buddy=(Employee)buddies.getFirst();

  

1。对原始方法(也就是擦除之后的)Pair.getFirst()的调用,这个方法返回一个Object对象。

2。将返回的Object类型的对象强制转换为Employee。

通配符:

直观地讲,带有超类型限定的通配符声明的对象,可以对其进行写入操作。

而带有子类型限定的通配符声明的对象,可以对其进行读取操作。

java 泛型编程学习的更多相关文章

  1. JAVA泛型编程笔记

    1介绍 Java泛型编程是JDK1.5版本后引入的.泛型让编程人员能够使用类型抽象,通常用于集合里面. 下面是一个不用泛型例子: List myIntList=new LinkedList(); // ...

  2. Java的学习之路

    记事本 EditPlus eclipse Java的学习软件,已经系统性学习Java有一段时间了,接下来我想讲一下我在Java学习用到的软件. 1.第一个软件:记事本 记事本是Java学习中最基础的编 ...

  3. Java多线程学习笔记

    进程:正在执行中的程序,其实是应用程序在内存中运行的那片空间.(只负责空间分配) 线程:进程中的一个执行单元,负责进程汇总的程序的运行,一个进程当中至少要有一个线程. 多线程:一个进程中时可以有多个线 ...

  4. Java Web 学习路线

    实际上,如果时间安排合理的话,大概需要六个月左右,有些基础好,自学能力强的朋友,甚至在四个月左右就开始找工作了.大三的时候,我萌生了放弃本专业的念头,断断续续学 Java Web 累计一年半左右,总算 ...

  5. Java基础学习-- 继承 的简单总结

    代码参考:Java基础学习小记--多态 为什么要引入继承? 还是做一个媒体库,里面可以放CD,可以放DVD.如果把CD和DVD做成两个没有联系的类的话,那么在管理这个媒体库的时候,要单独做一个添加CD ...

  6. 20145213《Java程序设计学习笔记》第六周学习总结

    20145213<Java程序设计学习笔记>第六周学习总结 说在前面的话 上篇博客中娄老师指出我因为数据结构基础薄弱,才导致对第九章内容浅尝遏止地认知.在这里我还要自我批评一下,其实我事后 ...

  7. [原创]java WEB学习笔记95:Hibernate 目录

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

  8. Java多线程学习(转载)

    Java多线程学习(转载) 时间:2015-03-14 13:53:14      阅读:137413      评论:4      收藏:3      [点我收藏+] 转载 :http://blog ...

  9. java基础学习总结——java环境变量配置

    前言 学习java的第一步就要搭建java的学习环境,首先是要安装JDK,JDK安装好之后,还需要在电脑上配置"JAVA_HOME”."path”."classpath& ...

随机推荐

  1. Web Form 和asp.net mvc 差别

    Asp.net MVC 和web Form的基本区别 Web Form ASP.NET MVC 视图和逻辑紧密耦合 视图和逻辑分离 页面(给予文件的URL) 控制器(基于路由的URL) 状态管理(视图 ...

  2. android插件中或者library中获取asstes文件

    在插件中或者library的项目中把文件放在asstes,不能用context.getResources().getAssets().open(fileName)读取到流,会报FileNotFound ...

  3. Mac MySQL 转移 datadir

    mysql默认的datadir在启动盘上面,有时database太大,于是决定将datadir迁到存储盘中 Step 1 将原datadir迁到存储盘 mv /usr/local/var/mysql ...

  4. Spring boot centos7 后台服务安装部署

    Spring boot 应用服务安装部署(maven工程) 1.首先在maven工程的pom文件中引入以下标签并保存 <build> <plugins> <plugin& ...

  5. Scrollview嵌套listview

    //建立Scrollview类 public class MyScrollView extends ScrollView { public MyScrollView(Context context, ...

  6. CocoaPods报错:The dependency `Alamofire ` is not used in any concrete target

    看到这个错误提示,首先看看自己的版本是不是 OS X EI Capitan,也就是10.10以后的版本,因为这个版本是比较新的版本,网络上找的那些安装cocoapod命令其实有些过时了,特别是创建po ...

  7. 多模块打包后,扫描不到@controller和@service,实现 ADD DIRECTORY ENTRIES

    多模块打包后,扫描不到@controller和@service等Bean. 原因:打包时没有生成目录信息 解决办法: 1.在eclipse或者myeclipse 打包时 勾选 ADD DIRECTOR ...

  8. SQL NOT EXISTS

    看了一篇文章,虽然知识点很简单,但是还是帮我理解了一些以前没想到的东西 一共三个表student,class,score create table student(sno varchar(50) no ...

  9. C# 下载搜狗词库

    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); string[] userAgent = new string[]{& ...

  10. WebAPI IIS PUT和DELETE请求失败

    IIS拒绝PUT和DELETE请求是由于IIS为网站默认注册的一个名为WebDAVModule的自定义HttpModule导致的,如果我们的站点不需要提供针对WebDAV的支持,解决这个问题最为直接的 ...