java 泛型编程学习
先发布,以后有空再修改。。。
第一次看到《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 泛型编程学习的更多相关文章
- JAVA泛型编程笔记
1介绍 Java泛型编程是JDK1.5版本后引入的.泛型让编程人员能够使用类型抽象,通常用于集合里面. 下面是一个不用泛型例子: List myIntList=new LinkedList(); // ...
- Java的学习之路
记事本 EditPlus eclipse Java的学习软件,已经系统性学习Java有一段时间了,接下来我想讲一下我在Java学习用到的软件. 1.第一个软件:记事本 记事本是Java学习中最基础的编 ...
- Java多线程学习笔记
进程:正在执行中的程序,其实是应用程序在内存中运行的那片空间.(只负责空间分配) 线程:进程中的一个执行单元,负责进程汇总的程序的运行,一个进程当中至少要有一个线程. 多线程:一个进程中时可以有多个线 ...
- Java Web 学习路线
实际上,如果时间安排合理的话,大概需要六个月左右,有些基础好,自学能力强的朋友,甚至在四个月左右就开始找工作了.大三的时候,我萌生了放弃本专业的念头,断断续续学 Java Web 累计一年半左右,总算 ...
- Java基础学习-- 继承 的简单总结
代码参考:Java基础学习小记--多态 为什么要引入继承? 还是做一个媒体库,里面可以放CD,可以放DVD.如果把CD和DVD做成两个没有联系的类的话,那么在管理这个媒体库的时候,要单独做一个添加CD ...
- 20145213《Java程序设计学习笔记》第六周学习总结
20145213<Java程序设计学习笔记>第六周学习总结 说在前面的话 上篇博客中娄老师指出我因为数据结构基础薄弱,才导致对第九章内容浅尝遏止地认知.在这里我还要自我批评一下,其实我事后 ...
- [原创]java WEB学习笔记95:Hibernate 目录
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...
- Java多线程学习(转载)
Java多线程学习(转载) 时间:2015-03-14 13:53:14 阅读:137413 评论:4 收藏:3 [点我收藏+] 转载 :http://blog ...
- java基础学习总结——java环境变量配置
前言 学习java的第一步就要搭建java的学习环境,首先是要安装JDK,JDK安装好之后,还需要在电脑上配置"JAVA_HOME”."path”."classpath& ...
随机推荐
- 黑马----JAVA内部类
黑马程序员:Java培训.Android培训.iOS培训..Net培训 黑马程序员--JAVA内部类 一.内部类分为显式内部类和匿名内部类. 二.显式内部类 1.即显式声明的内部类,它有类名. 2.显 ...
- Hadoop是什么?一句话理解
Hadoop(MapReduce&HDFS) 1.学习目的(前言) 在从业了六年IT生涯里,做个实施顾问.业务顾问.BA需求分析师.项目经理,现在重新定位自己,在新公司做起了开发顾问,虽然经历 ...
- 禁用CMFCRibbonApplicationButton的单击和双击事件
为了禁用CMFCRibbonApplicationButton的单击和双击事件,我重载了CMFCRibbonApplicationButton如下: 1. MyRibbonApplicationBut ...
- start a new android studio project not working
现象:点击无响应 解决:Configure -> Project Defaults -> Project Structure -> Platform Settings (SDK) c ...
- C# DES进行加解密
DES加解密 /// 进行DES加密. /// </summary> /// <param name="pToEncrypt">要加密的字符串.</p ...
- UE4 不能显示中文 解决办法
UE4 4.11.2 方法步骤: 1.在内容浏览器新建一个字体文件如图: 2.打开刚刚创建的那个字体文件: 选择Offline,会有一个弹出框点击 “是” 接下来就选择你要用到的字体 红色矩形框出的文 ...
- UIPickerView控件中自定义展示的字体大小及样式
- (UIView *)pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger) ...
- java的VO和PO的用途
最近在搞一个项目,用到了 springMVC,加深了我对VO和PO的理解,有感而发. 1 写在之前的提示 VO == Value Object PO == Persistant Object VO对应 ...
- css3新增的属性选择器
使用css选择器,可以实现一个样式对应多个html文档的元素,在{}前面的部分就是"选择器",指明了样式的作用对象. 在CSS中追加了三个属性选择器:[att*=val].[att ...
- ADB命令详解
一.adb介绍 ADB的全称为Android Debug Bridge,字面意思就是安卓调试桥接,简单点说,它是Android系统提供的一套工具,通过它,我们可以在电脑上建立一个连接到手机的通道,然后 ...