`
ol_beta
  • 浏览: 283756 次
  • 性别: Icon_minigender_1
  • 来自: 天津
社区版块
存档分类
最新评论

java泛型实现原理

    博客分类:
  • java
阅读更多

JDK1.5增加的新特性里面有一个就是泛型。对于泛型的评价,褒贬不一,废话不多说,先来看看他的原理。

泛型是提供给javac编译器使用的,可以限定集合中的输入类型,让编译器拦截源程序中的非法输入,编译器编译带类型说明的集合时会去掉类型信息,对于参数化得泛型类型,getClass()方法的返回值和原始类型完全一样。

对于下面这个源程序: 

public class Oliver {
	public static void main(String[] args) {
		ArrayList<String> list = new ArrayList<String>();
		list.add("str1");
		list.add("str2");
		String str = list.get(0);
	}
}
 

编译成Oliver.class后反编译的内容: 

public class Oliver {
	public Oliver() {
	}

	public static void main(String[] args) {
		ArrayList list = new ArrayList();
		list.add("str1");
		list.add("str2");
		String str = (String) list.get(0);
	}
}
 
也就是说java的泛型只是在编译器做了参数限制,其实对性能并没有什么优化!

由于编译生成的字节码会去掉泛型的类型信息,只要能跳过编译器,就可以往某个泛型集合中加入其它的类型数据。 
下面代码展示利用反射机制跳过编译器检查: 

public class Oliver {
	public static void main(String[] args) throws Exception {
		ArrayList<Integer> list = new ArrayList<Integer>();
		list.getClass().getMethod("add", Object.class).invoke(list, "ssss");
		System.out.println("list:" + list.get(0));
	}
}
输出结果: 
list:ssss

 

对于java泛型,Bruce Ecke(Thinking in Java作者)曾经给出这样的评论: 
Guess what. I really don't care. You want to call it "generics," fine, implement something that looks like C++ or Ada, that actually produces a latent typing mechanism like they do. But don't implement something whose sole purpose is to solve the casting problem in containers, and then insist that on calling it "Generics." Of course, Java has long precedence in arrogantly mangling well- accepted meanings for things: one that particularly stuck in my craw was the use of "design pattern" to describe getters and setters. In JDK 1.4 we were told some lame way to use assertions which was a backward justification for them being disabled by default. JDK 1.4 also had to invent its own inferior logging system rather than using the openly created, well-tested and well-liked Log4J. And we've also been told many times about how Java has been as fast or faster than C++, or about how one or another feature is great and flawless. I point to the threads implementation which has had major changes quietly made from version to version with not so much as a peep of apology or admission that "hey, we really screwed up here." Or maybe I was just not on that particular announcement list.

分享到:
评论

相关推荐

    java泛型的内部原理及更深应用

    本课程为传智播客《张孝祥Java高新技术》视频教程,教程采用的AVI方式发布,所以看起来很流畅,大家可以通过本套视频第一集包中附带的CamPlay.exe(拖入即可)观看和学习。

    Java泛型继承原理与用法详解

    主要介绍了Java泛型继承原理与用法,结合实例形式分析了java泛型继承的相关原理与实现技巧,需要的朋友可以参考下

    JAVA泛型的继承和实现、擦除原理解析

    主要介绍了JAVA泛型的继承和实现、擦除原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

    Java定义泛型接口和类的方法实例分析

    主要介绍了Java定义泛型接口和类的方法,结合实例形式分析了泛型相关概念、原理及泛型接口与类的定义实现方法,需要的朋友可以参考下

    基于java8新特性+反射机制实现list不同实体类互转.zip

    实现list不同泛型之间实体的互转,基于java8新特性+反射机制实现list不同实体类互转,将jdk8的流处理集合互转抽出来成一个工具类,实现lsit

    【Java面试+Java学习指南】 一份涵盖大部分Java程序员所需要掌握的核心知识

    Java集合详解1:一文读懂ArrayList,Vector与Stack使用方法和实现原理 Java集合详解2:Queue和LinkedList Java集合详解3:Iterator,fail-fast机制与比较器 Java集合详解4:HashMap和HashTable Java集合详解5:深入...

    JAVA反射机制原理剖析配经典例子,以及模拟DBUTIL发射实现的JDBC操作包自己写的一个DEMO.★

    JAVA反射机制原理剖析配经典例子,以及模拟DBUTIL发射实现的JDBC操作包自己写的一个DEMO 如果模拟写的弄懂了 反射机制保准你懂了!

    Java工程师面试复习指南

    Java集合详解:一文读懂ArrayList,Vector与Stack使用方法和实现原理 Java集合详解:Queue和LinkedList Java集合详解:迭代器,快速失败机制与比较器 Java集合详解:HashMap和HashTable Java集合详解:深入理解...

    中高级安卓那些 面试官 最爱问的原理问题(一)

    1、Java泛型的实现机制是怎样的? Java 泛型采用 类型擦除实现 类型编译时被擦除为 object, 不兼容基本类型 类型擦除的实现方案主要考虑向后兼容 泛型类型签名信息特定场景下反射可获取 结合项目实践, 例如 Gson...

    java面试手册及各类java书籍

    高级特性篇:涵盖Java中的高级特性,如集合框架、泛型、异常处理、多线程、网络编程等,帮助读者提升Java编程能力。 框架篇:介绍Java中常用的框架,如Spring、Hibernate、MyBatis等,使读者能够快速掌握框架的使用...

    JAVA上百实例源码以及开源项目

    百度云盘分享 ... Java实现的FTP连接与数据浏览程序,实现实例化可操作的窗口。  部分源代码摘录:  ftpClient = new FtpClient(); //实例化FtpClient对象  String serverAddr=jtfServer.getText();...

    JAVA上百实例源码以及开源项目源代码

     Java实现的FTP连接与数据浏览程序,实现实例化可操作的窗口。  部分源代码摘录:  ftpClient = new FtpClient(); //实例化FtpClient对象  String serverAddr=jtfServer.getText(); //得到服务器地址  ...

    Java基础知识点总结.docx

    十九、 Ajax原理及实现步骤★★★★★ 130 Ajax概述 130 Ajax工作原理 130 Ajax实现步骤 130 详解区分请求类型: GET或POST 131 $.ajax标准写法 134 二十、 正则表达式:其实是用来操作字符串的一些规则★★★☆ 135 ...

    java最新面试题50道精讲

    5 、解释一下Java中的泛型是什么,以及如何使用泛型? 6 、解释一下Java中的多线程是什么,以及如何创建和管理线程? 7 、解释一下Java中的反射机制是什么,以及如何使用反射? 8 、解释一下Java中的注解是什么,...

    C++实现的泛型List类分享

    额,不要说我三心二意:一边在看.NET和CLR的原理、一边在看JavaScript、一边在看Java;有时看算法有时看Unity、Hibernate;有时看Hadoop有时看Redis;现在又开始看C++了。 以前觉得无论什么语言嘛,其实都差不多,...

    【大厂面试题总结】JavaSE面试题总结详细教程

    【大厂面试题总结】JavaSE面试题总结详细教程: 目录: 递归算法之输出某个目录下所有文件和子目录列表 泛型中extends和super的区别 内部类的理解 ...java中实现多态的机制 string常量池和intern韩雅茹

    疯狂JAVA讲义

    11.7.1 画图的实现原理 418 11.7.2 使用Graphics类 419 11.8 处理位图 425 11.8.1 Image抽象类和BufferedImage实现类 425 11.8.2 使用ImageIO输入/输出位图 427 11.9 剪贴板 432 11.9.1 数据传递的类...

    达内java培训目录

    JavaSE核心 异常处理、多线程基础、IO系统、网络编程、Java反射机制、JVM性能调优(JVM内存结构剖析、GC分析及调优、JVM内存参数优化)、Java泛型、JDK新特性 熟练掌握JavaSE核心内容,特别是IO和多线程;...

    习----题-Java-Web程序设计教程-[共2页].pdf

    另外,在前面的比较接口中也可以使用泛型,例如例 3.3 的 MyCmp 类还可以这样来实现, 请看如下语句。 public class MyCmp implements Comparator&lt;Student&gt;{ public int compare(Student s1, Student s2){ …… } }...

    【大厂面试题总结】JavaSE面试题合集及其答案,基本包括javaSE所有知识点和详细解释

    【大厂面试题总结】JavaSE面试题合集及其答案,基本包括javaSE所有知识点和详细解释 。 JavaSE面试题总结详细教程: 目录: 递归算法之输出某个目录下所有文件和子目录...java中实现多态的机制 string常量池和intern

Global site tag (gtag.js) - Google Analytics