`

java 泛型实现原理与类型擦除

    博客分类:
  • java
 
阅读更多
Java中的泛型都是在编译器这个层次来实现的。

在生成的Java字节码中是不包含泛型中的类型信息的。使用泛型的时候加上的类型参数,会在编译器在编译的时候去掉。这个过程就称为类型擦除。

如在代码中定义的List<Object>和List<String>等类型在编译后都会变成List,JVM看到的只是List,而由泛型附加的类型信息对JVM来说是不可见的。Java编译器会在编译时尽可能的发现可能出错的地方,但是仍然无法避免在运行时刻出现类型转换异常的情况。
   Java编译器是通过先检查代码中泛型的类型,然后再进行类型擦除,在进行编译的
   
public class Test10 {
	public static void main(String[] args) {
		
		//
		ArrayList<String> arrayList1=new ArrayList();
		arrayList1.add("1");//编译通过
		arrayList1.add(1);//编译错误
		String str1=arrayList1.get(0);//返回类型就是String
		
		ArrayList arrayList2=new ArrayList<String>();
		arrayList2.add("1");//编译通过
		arrayList2.add(1);//编译通过
		Object object=arrayList2.get(0);//返回类型就是Object
		
		new ArrayList<String>().add("11");//编译通过
		new ArrayList<String>().add(22);//编译错误
		String string=new ArrayList<String>().get(0);//返回类型就是String
	}
}

    


public class Test4 {
	public static void main(String[] args) {
		ArrayList<String> arrayList1=new ArrayList<String>();
		arrayList1.add("abc");
		ArrayList<Integer> arrayList2=new ArrayList<Integer>();
		arrayList2.add(123);
                //返回true 说明都是原始类型
		System.out.println(arrayList1.getClass()==arrayList2.getClass());
	}
}

类型检查就是针对引用的,谁是一个引用,用这个引用调用泛型方法,就会对这个引用调用的方法进行类型检测,而无关它真正引用的对象。

转自:http://blog.csdn.net/lonelyroamer/article/details/7868820


分享到:
评论
发表评论

文章已被作者锁定,不允许评论。

相关推荐

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

    1. **类型擦除**:Java泛型的主要特点是类型擦除。这意味着在编译完成后,所有的泛型信息都会被擦除,替换为Object或者其他基础类型。因此,泛型在运行时并不存在,所有关于泛型的操作都在编译期间完成。 2. **边界...

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

    然而,Java泛型的实现机制——类型擦除,也带来了一系列的问题和限制。本文将深入探讨Java泛型擦除的工作原理、它对编程的影响,以及在实际开发中的应对策略。 Java泛型的类型擦除机制是Java泛型实现的核心,它使得...

    Java泛型的深度解析:原理、应用与最佳实践

    Java泛型是Java 5中引入的一项强大特性,它...了解泛型的原理、声明方式、类型擦除、边界以及通配符的使用,对于掌握Java编程中的高级技术至关重要。通过合理地使用泛型,我们可以构建出更加健壮和可扩展的Java应用程序

    java泛型深入.pdf

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

    JVM如何理解Java泛型类.doc

    尽管如此,由于JVM本身的限制,所有的泛型信息在编译后都会被擦除,因此理解类型擦除的概念对于正确使用Java泛型至关重要。开发者应该注意在创建泛型对象时明确指定类型参数,并理解编译时与运行时的区别,以避免...

    Java泛型编程最全总结

    关于泛型的类型擦除,这是Java泛型的一个重要特性。由于Java的虚拟机不支持泛型,所以在编译后,所有的泛型信息都会被擦除,替换为具体的类型,如`ArrayList&lt;String&gt;`会被转化为`ArrayList&lt;Object&gt;`。这就意味着在...

    java泛型Demo

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

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

    类型擦除是Java泛型的一个重要特性,它意味着在运行时,所有的泛型信息都会被消除,替换为Object类型。因此,`A2`类中的`getInfo()`方法必须通过调用`super.getInfo().toString()`来确保返回String类型,因为在编译...

    java 泛型的使用 详细讲解

    本文将详细介绍Java泛型的概念、原理以及如何在实际开发中使用泛型。 #### 二、泛型的概念与意义 ##### 2.1 什么是泛型? 泛型(Generics)是指在面向对象编程中,通过参数化类型来达到类型重用的目的。通俗地说...

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

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

    Java泛型设计及其PECS原则解析

    使用场景及目标:帮助读者深入理解Java泛型的内在原理和高级用法,掌握PECS原则,从而能够在项目中更高效地运用泛型,提高代码质量和安全性。 其他说明:文章不仅提供了理论知识,还通过实例代码演示了泛型的实际...

    Java泛型和集合-英文版

    8. 类型擦除(Type Erasure):Java的泛型在实现时使用了类型擦除技术,这意味着泛型类型信息在编译后不会存在于JVM字节码中。这个机制有其优点也有缺点,优点是兼容旧版Java代码,缺点是无法实现泛型数组等特性。 ...

    Java泛型深入解析:类型安全的灵活编程

    Java泛型是一个强大的特性,它提供了类型安全的集合操作和代码重用性。通过理解泛型的工作原理和高级特性,开发者可以编写出更安全、更灵活的代码。尽管泛型有一些限制,但它仍然是现代Java编程中不可或缺的一部分。

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

    1. 泛型的类型参数只能是引用类型,不能是基本数据类型,因为Java泛型是基于类型擦除的。 2. 泛型可以有多个版本,例如Genericity可以有Genericity、Genericity等不同的类型参数实例。 3. 泛型的参数可以有多个,...

    java泛型精华

    Java泛型的实现方式被称为“擦除”(Erasure),即在编译阶段,编译器会根据泛型参数进行类型检查和推断,但最终生成的字节码并不包含泛型信息。这意味着,如`List&lt;Integer&gt;`和`List&lt;String&gt;`在运行时实际上是同一个...

    Java泛型梳理.

    #### 五、类型擦除与原始类型 - **类型擦除的原理**:为了确保与旧版Java代码的兼容性,Java虚拟机(JVM)在运行时并不识别泛型信息,而是通过类型擦除将泛型类型转换为原始类型。原始类型指的是未指定类型参数的...

    java泛型编程

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

    java泛型学习

    - **实现原理**:泛型的实现机制被称为“类型擦除”。这意味着在编译阶段,编译器会根据泛型参数进行类型检查,确保代码的安全性,之后会将类型信息擦除,并生成常规的字节码。这种机制简化了运行时的操作,但同时也...

    java泛型md,学习代码

    1. **类型擦除**:Java的泛型在编译后会被擦除,因此泛型不会在运行时存在。这意味着无法在运行时检查泛型类型,所有有关泛型的检查都在编译时完成。 2. **通配符**:在需要与多种类型的泛型集合交互时,可以使用...

Global site tag (gtag.js) - Google Analytics