初学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() 这类 ...
随机推荐
- 关于安装teamviewer11出现verification of your teamviewer version failed错误处理
关于安装teamviewer11出现verification of your teamviewer version failed错误处理 teamviewer 在ubuntu 中安装方法是: 去tea ...
- Blender 之 Splash 代码分析
注:以下内容基于 Blender 2.7x 版本工程,其它低版本可能有改动. Blender启动完成时,会出现一个画面,英文叫Splash.默认是打开的,可以在设置里关闭.在文件菜单里点击用户首选项( ...
- RadioButton(单选按钮)文字在按钮的左边
<RadioButton style="@style/CustomCheckboxTheme" android:layout_width="fill_parent& ...
- 关于在django框架里取已登录用户名字的问题
在 views里取值是这样的 request.user.username而在模板页面取值是这样的:{{request.user}} 判断是否通过验证是这样的 {% if request.user.is ...
- jquery轮播图详解,40行代码即可简单解决。
我在两个月以前没有接触过html,css,jquery,javascript.今天我却在这里分享一篇技术贴,可能在技术大牛面前我的文章漏洞百出,也请斧正. 可以看出来,无论是div+css布局还是jq ...
- PHP 显示文章发布日期 一小时前 一天前 一月前 一年前
<?PHP /*** 传入日期格式或时间戳格式时间,返回与当前时间的差距,如1分钟前,2小时前,5月前,3年前等* @param string or int $date 分两种日期格式" ...
- 第一天ci框架开发商城2
ci框架开发商城2 1/28/2016 9:45:52 PM mvc完整案例 mvc完成新闻的增删改查 news控制器news.php class News extends CI_controller ...
- python常用模块json、os、sys
一.序列化 json & pickle 模块 json--用于字符串和Python数据类型间进行转换 pickle---用于python特有的类型和Python的数据类型间进行转换 json: ...
- 【转】apache 二级域名设置完整步骤
原文链接:http://blog.sina.com.cn/s/blog_5375d76b01014fnt.html 最近在折腾网站二级域名的事情,在网上查了很多零碎的文档,不完整,有些也没有自己验证, ...
- IT
http://www.cnblogs.com/TomXu/archive/2011/12/19/2291448.html " 经常从Recruiter那里得到抱怨:“汤姆,为什么面试者每次回 ...