初学java之12 泛型编程的个人理解总结
首先,强调一个观点:
对于我这样的初学者,一定要站在虚拟机和编译器的角度来分析java 语言的种种特性,泛型也不例外。(我认为这个一条正确的学习经验)
写这篇文章起源于最近在学java,有一天在路上和一个同事在讨论什么是java泛型的时候,发现有些概念非常模糊。于是,我想澄清一下,并记录下来。
希望看过的朋友能够纠正里面的错误。非常感谢。
1 关于Java 泛型机制
在java 最初版本,
Java 泛型是通过 继承实现的,我认为 这里的继承,不是类的继承而是类型的继承.
example
public class Test
{
Object var;
Object getVar();
Void setVar( Object );
}
这是一个类.
泛型应用是这样做的
Test testObj= new =Test();
class A
{}
A a = new A();
a = (A)getVar();
因为A类 是Object类的子类,这样的话,通过类型强制转换,就可以实现赋值。
class B ,class C等等 道理一样。
通过这种方式实现和C++ 泛型一样的效果。唯一需要注意的地方在于类型转换,类型判断这些类型相关的操作需要程序员干预。
我猜测,Java 的泛型机制就是建立在类型继承这个基础上,后面版本的泛型 本质上也是这样做的
2 关于泛型的类型擦除
作为一个泛型类的开发人员,我们定义了一个泛型类,
比如
example
public class Test<T>
{
T var;
T getVar();
Void setVar( T t);
}
说明,这个的T 是一个相对于class Test 的类型参数,(可以类比: 在 void func( int x ) 中,int x是相对于method : func 的类型参数,x 是类型变量一样,)
这个泛型类在编译器中会被做一些处理而生成一个类文件。
选择原始类型(比如Object类),替代 类定义内的所有 T ,
将<T> 抹去
结果是生成的类文件效果等同于
public class Test
{
Object var;
Object getVar();
void setVar( Object t);
}
这个过程就叫做java 泛型类型擦除。
这个过程说明什么呢?
说明对于编译器而言,是不存在什么Test<String>类,Test<Date>类等等的。
对于Test<xx> 各种对象,它们都属于同一个类 Test ;
但要注意,编译器看到泛型格式<T >,编译会做一些额外的事情,比如类型转换,桥方法等等。编译器在这里把以前程序员需要手动做的事情给做。
毕竟程序员写的代码是要给编译器看懂的。通过泛型一些约定的规则,让程序员的意图为编译器所准确知道,这样写出的代码才不会有问题。
泛型类型的继承问题
首先,继承是一个类,类型之间关系的问题,所以就和对象没有关系.对象之间不存在继承的问题。
在上面的分析中,我们知道编译器不会产生具体类型参数的类。只会生成一个原始类型的普通类。即只有一个类。
那么这里又何来 泛型类型的继承问题呢?
我的理解是: 类型的继承和类的继承不是同一个概念,应该说,类型继承是类型继承,类继承也是类型继承,但类型继承就不一定是类继承
Texample : Test<String > 是 Test 的一个子类型, 并不是: Test<String > 是一个类,Test 是另一个类,Test<String > 是 Test 的子类.
在继承这个概念中,类型继承是一个超类,而类继承是一个子类。,类继承也是类型继承的一种情况,而不能说因为A类型是继承B类型,就推导出A是一个类,B是另一个类。A是B的子类。
我不知道UML里面是不是这样定义的。
初学java之12 泛型编程的个人理解总结的更多相关文章
- 初学 Java Web 开发,请远离各种框架,从 Servlet 开发
Web框架是开发者在使用某种语言编写Web应用服务端时关于架构的最佳实践.很多Web框架是从实际的Web项目抽取出来的,仅和Web的请求和响应处 理有关,形成一个基础,在开发别的应用项目的时候则可以从 ...
- Java Serializable(序列化)的理解和总结、具体实现过程(转)
原文地址:http://www.apkbus.com/forum.php?mod=viewthread&tid=13576&fromuid=3402 Java Serializable ...
- Java进阶(七)正确理解Thread Local的原理与适用场景
原创文章,始自发作者个人博客,转载请务必将下面这段话置于文章开头处(保留超链接). 本文转发自技术世界,原文链接 http://www.jasongj.com/java/threadlocal/ Th ...
- Java进阶(三十六)深入理解Java的接口和抽象类
Java进阶(三十六)深入理解Java的接口和抽象类 前言 对于面向对象编程来说,抽象是它的一大特征之一.在Java中,可以通过两种形式来体现OOP的抽象:接口和抽象类.这两者有太多相似的地方,又有太 ...
- 初学Java web(转)
转自 http://www.oschina.net/question/12_52027 OSCHINA 软件库有一个分类——Web框架,该分类中包含多种编程语言的将近500个项目. Web框架是开发者 ...
- Java基础系列1:深入理解Java数据类型
Java基础系列1:深入理解Java数据类型 当初学习计算机的时候,教科书中对程序的定义是:程序=数据结构+算法,Java基础系列第一篇就聊聊Java中的数据类型. 本篇聊Java数据类型主要包括四个 ...
- 对Java Serializable(序列化)的理解和总结
我对Java Serializable(序列化)的理解和总结 博客分类: Java技术 JavaOSSocketCC++ 1.序列化是干什么的? 简单说就是为了保存在内存中的各种对象的状 ...
- 阿里JAVA开发手册零度的思考理解(二)
转载请注明原创出处,谢谢! 说在前面 人生的大道上默默地走,就必须要有一盏灯亮着为你引导方向!而这盏灯抑或只是一句话,一句鼓励,一个赞美,一次承认,一次认可,一次相识一次交流-- 上篇文章:阿里JAV ...
- Java四种引用--《深入理解Java虚拟机》学习笔记及个人理解(四)
Java四种引用--<深入理解Java虚拟机>学习笔记及个人理解(四) 书上P65. StrongReference(强引用) 类似Object obj = new Object() 这类 ...
随机推荐
- 分布式之ZookeeperMac安装
Zookeeper用于分布式计算中的协调员,观察员,观察者,分布式锁,在系统中利用Zookeeper来处理事件通知,队列,锁等功能. 使用brew安装 zookeeper. 可参考:http://bl ...
- MongoVue中Collections无法显示的问题
问题描述: 通过Python向MongoDB写入数据后,MongoVue中Collections无法显示的问题 原因: Mongodb 3.0之后默认的 storageEngine为wiredTige ...
- AngularJS 包含
在 AngularJS 中,你可以在 HTML 中包含 HTML 文件. 在 HTML 中,目前还不支持包含 HTML 文件的功能. 大多服务端脚本都支持包含文件功能 (SSI: Server Sid ...
- js中substr,substring,slice。截取字符串的区别
substr(n1,n2) n1:起始位置(可以为负数) n2:截取长度(不可以为0,不可以为负数,可以为空) 当n1为正数时,从字符串的n1下标处截取字符串(起始位置),长度为n2. 当n1为负数时 ...
- JS技巧
2016-08-09 200多个js技巧代码(Down) word下载 200多个js技巧代码 目录 1.文本框焦点问题... 6 2.网页按钮的特殊颜色... 6 3.鼠标移入移出时颜色变化... ...
- 在nginx中配置ip直接访问的默认站点
一台机子部署多个网站,我们直接访问ip (外网内网都一样)提示无法访问或404. 因为有多个网站,我们想指定某个网站为IP访问默认的网站,如何操作呢? 解:在Listen ip:port; 这个指令行 ...
- RSA算法学习
package com.test.rsa; /* * 为了选择公钥和私钥,Bob必须执行如下步骤: * 1)选择两个大素数p和q.那么p和q应该多大呢?该值越大,RSA越难于破解,但是执行加密和解密所 ...
- HDU 5795 A Simple Nim 打表求SG函数的规律
A Simple Nim Problem Description Two players take turns picking candies from n heaps,the player wh ...
- SGIP、SMGP 长短信发送问题小结
长短信发送问题.1.将信息长度拆开发送.2.为了解决长短信拆分发送,在手机终端,收到的顺序错乱,所以在每一段短信发送完成后,延时5秒,这样在手机终端客户收到的信息,就会按照拆分的顺序发送. //信息总 ...
- 各大IT技术博客排行榜
cnblogs 积分排名前3000名 http://www.cnblogs.com/ 左侧有推荐博客排行 cppblog http://www.cppblog.com/AllBloggers.aspx ...