`
ol_beta
  • 浏览: 290505 次
  • 性别: 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泛型是Java编程语言中的一个强大特性,它允许在定义类、接口和方法时使用类型参数,从而实现参数化类型。这使得代码更加安全、可读性更强,并且能够减少类型转换的必要。在“java泛型的内部原理及更深应用”这个...

    Java泛型擦除深度解析:原理、影响与编程实践

    Java泛型的类型擦除机制是Java泛型实现的核心,它使得泛型只能在编译时提供类型安全。虽然这种机制带来了一些限制,如运行时类型错误、泛型类型参数不能是基本类型、无法创建泛型类型的实例、泛型类型参数不能使用...

    Java泛型使用详细分析.pdf

    在本文中,我们将详细介绍 Java 泛型的使用方法和实现原理。 一、泛型的简介 泛型是 Java 5 中引入的一种语言特性,旨在解决类型安全问题。在 Java 中,泛型可以应用于集合、类、接口和方法中。泛型的主要目的是...

    java泛型深入.pdf

    Java泛型是Java语言中用于处理类型安全的一种机制,它允许在编译期间提供类型检查,并在运行时消除了类型转换。Java泛型深入的内容涵盖泛型的基本概念、泛型类、接口、方法以及泛型的使用限制和高级特性。 首先,...

    java泛型Demo

    Java泛型是Java编程语言中的一个关键特性,它在2004年随着JDK 5.0的发布被引入。泛型的主要目的是提供类型安全,帮助程序员在编译时发现可能的类型错误,同时也提供了更好的代码重用。在这个"java泛型Demo"中,我们...

    Java泛型编程最全总结

    Java泛型是Java编程语言中的一个关键特性,它在2004年随着JDK 5.0的发布被引入,极大地增强了代码的类型安全性和重用性。泛型允许我们在编写类、接口和方法时指定参数化类型,使得代码在编译时期就能捕获类型错误,...

    Java泛型与容器详细笔记.pdf (带书签)

    Java泛型与容器详细笔记涉及到Java编程语言中的两个重要概念:泛型(Generics)和容器(Containers)。容器主要包括Java集合框架中的各类集合类,如List、Set、Map等,它们用于存储和操作数据。泛型则提供了一种类型...

    使用Java泛型实现一个简单的银行账户类.txt

    ### 使用Java泛型实现一个简单的银行账户类 在Java编程语言中,泛型是一种非常强大的功能,它允许我们编写更加灵活、可重用且类型安全的代码。本篇将详细介绍如何利用Java泛型来实现一个能够支持不同类型的银行账户...

    java泛型精华

    本文将深入探讨Java泛型的精髓,解析其工作原理,以及在使用过程中可能遇到的问题和解决方案。 #### 泛型擦除与类型安全 Java泛型的实现方式被称为“擦除”(Erasure),即在编译阶段,编译器会根据泛型参数进行...

    Java泛型和集合-英文版

    根据提供的文件信息,我们可以确定本书的标题为《Java泛型和集合》(Java Generics and Collections),作者为Maurice Naftalin和Philip Wadler。该书详细介绍了Java中的泛型(Generics)特性以及集合(Collections...

    泛型工具类

    ### 泛型工具类在IT行业的应用与理解 在现代软件开发中,泛型作为一种强大的类型...对于任何希望深入了解Java泛型和设计模式的开发者来说,深入研究并掌握此类工具类的实现原理和应用场景都是一项非常有价值的技能。

    java泛型编程

    本文将详细探讨Java泛型的基础概念、工作原理以及如何在实际开发中有效地使用泛型。 #### 二、Java泛型编程的重要性 Java泛型编程的主要目的是提高代码的复用性和类型安全性。在没有泛型之前,开发者通常使用...

    java泛型md,学习代码

    【Java 泛型】是Java编程语言中一个强大的...总之,这个压缩包包含的内容涉及了Java泛型、Java Web开发基础、以及现代Web应用中数据存储的几种方式,对于深入理解和实践Java编程,尤其是后端开发有着重要的参考价值。

    Java语言程序设计教程课件第五章泛型和枚举

    泛型的实现原理关键点包括: 1. Java泛型是编译时特性,在JVM运行时不会保留泛型的类型信息。 2. Java泛型利用编译器擦除技术实现,这意味着泛型的源码在编译后会转化为非泛型版本的源码。 3. 泛型的类型擦除指的是...

    Java泛型梳理.

    ### Java泛型梳理 #### 一、泛型概念解析 泛型是一种参数化的类型机制,其核心在于将具体的类型参数化处理。这种处理方式类似于函数中的变量参数——具体类型可以在定义时留空,而在实际使用时传入。这种方式极大...

    java泛型学习

    ### Java泛型学习知识点 #### 一、泛型的基本概念及意义 - **引入背景**:JDK 5.0 引入了泛型的概念,这是为了提高 Java 的类型安全性而进行的重要改进。泛型使得程序员能够在编程时指定类型参数,从而避免运行时...

    java泛型研究

    Java泛型是Java语言的一个重要特性,它在Java SE 5.0中被引入,极大地提高了代码的类型安全性和重用性。泛型允许在定义类、接口和方法时使用类型参数,使得这些构造能够在多种不同的数据类型上工作,而无需进行强制...

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

    总的来说,Java泛型的继承、实现和擦除原理是理解Java泛型机制的关键。正确地使用这些概念可以帮助我们编写更加安全、可读性更强的代码,并提高代码的复用性。了解这些原则对于Java开发者来说至关重要,有助于避免...

    java泛型详解

    3. **潜在的性能提升**:虽然Java泛型的初始实现主要是为了确保类型安全,但其设计也为未来的JVM优化留下了空间。由于泛型的实现完全由编译器处理,因此不会对JVM或类文件格式造成影响,这就意味着随着JVM的发展,...

Global site tag (gtag.js) - Google Analytics