首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Java 泛型(擦除转换,桥方法)

类型擦除 编译器在编译期间所以的泛型信息都会被擦除 编译 .java 生成的 .class (字节码文件)中数据类型必须是确定好的。...如果一个 class 是泛型类,或者含有泛型方法,那么编译器在编译时会将其中的类型变量去掉,生成一个泛型类同名的原始类。在 原始类class文件 中的是其真正的类型(原始类型)。...,用Object作为原始类型; 如果有限定(),用A作为原始类型; 如果有多个限定(),用第一个边界的类型变量A1类作为原始类型; 类型转换...当一个具有擦除返回类型的泛型方法被调用时会进行强制类型转换 Generic1中的 public T getValue() { return value; } 调用getValue方法时 Generic1...(); list.add(new Date()); Date myDate = list.get(0); 由于原始类型是Object,方法返回值是Object,但是在调用时会进行强制类型转换

89310

JAVA泛型类型擦除

泛型是在JAVA 1.5版本中才引入的,它能和以前的版本兼容的原因是泛型信息只存在于代码编译阶段,在进入 JVM 之前,泛型相关的信息会被擦除掉,即类型擦除。...泛型的定义使用 根据使用情况可以分为以下三种: 泛型类 泛型方法 泛型接口 下面是一个常用的泛型类: // 一个泛型类,可以根据需要包装不同结果的返回值 public class Result...在Java SE 1.5之前,没有泛型的情况的下,通过对类型Object的引用来实现参数的“任意化”,“任意化”带来的缺点是要做显式的强制类型转换,而这种转换是要求开发者对实际参数类型可以预知的情况下进行的...对于强制类型转换错误的情况,编译器可能不提示错误,在运行的时候才出现异常,这是一个安全隐患。泛型的好处是在编译的时候检查类型安全,并且所有的强制转换都是自动和隐式的,以提高代码的重用率。...class java.lang.Object */ 通过反射我们在运行时得到了data的类型,发现都是Object,证明代码编译后所谓泛型都没了,这就是泛型擦除

1.7K40
您找到你想要的搜索结果了吗?
是的
没有找到

初探Java类型擦除

本篇博客主要介绍了Java类型擦除的定义,详细的介绍了类型擦除Java中所出现的场景。 1. 什么是类型擦除 为了让你们快速的对类型擦除有一个印象,首先举一个很简单也很经典的例子。...而如果我们说到类型擦除为什么会出现,我们就必须要了解泛型。 2. 泛型 2.1. 泛型的定义 随着2004年9月30日,工程代号为Tiger的JDK 1.5发布,泛型从此大家见面。...而在1.5之前的版本中,为了让Java的类具有通用性,参数类型和返回类型通常都设置为Object,可见,如果需要不用的类型,就需要在相应的地方,对其进行强制转换,程序才可以正常运行,十分麻烦,稍不注意就会出错...通配符的应用场景 在其他函数中,例如JavaScript中,一个函数的参数可以是任意的类型,而不需要进行任意的类型转换,所以这样的函数在某些应用场景下,就会具有很强的通用性。...这次控制台会输出type: java.lang.String。可以看到,如果我们给泛型类制定了上限,泛型擦除之后就会被替换成类型的上限。而如果没有指定,就会统一的被替换成Object。

82630

Java基础篇:泛型类型擦除

二、泛型的好处: 没有泛型的情况的下,通过对类型Object的引用来实现参数的“任意化”,“任意化”带来的缺点是要做显式的强制类型转换,而这种转换是要求开发者对实际参数类型可以预知的情况下进行的。...而引入泛型后,有如下好处: 1、消除显式的强制类型转换,提高代码可读性: 泛型中,所有的类型转换都是自动和隐式的,不需要强制类型转换,可以提高代码的重用率,再加上明确的类型信息,代码的可读性也会更好。...三、Java类库中的泛型有那些?泛型的用途? (1)泛型类:最常见的用途就是容器类,通过泛型可以完成对一组类的操作对外开放相同的接口。...五、Java泛型的实现方法–类型擦除Java泛型的实现是靠类型擦除技术实现的,类型擦除是在编译期完成的,也就是在编译期,编译器会将泛型的类型参数都擦除成它指定的原始限定类型,如果没有指定的原始限定类型则擦除为...object类型,之后在获取的时候再强制类型转换为对应的类型,因此生成的Java字节码中是不包含泛型中的类型信息的,即运行期间并没有泛型的任何信息。

65720

Java语法糖之泛型类型擦除

1 泛型类型擦除 泛型,JDK 1.5新特性,本质是参数化类型(Parametersized Type) 的应用,即所操作的数据类型被指定为一个参数。...Java语言中的泛型则不一样,它只在程序源码中存在,在编译后的字节码文件中,就已经替换为原来的原生类型(Raw Type) ,并在相应地方插入强制转换代码。...因此,对运行期的Java来说Araylist、Aralist是同一个类。所以泛型是Java语言的一颗语法糖Java称为类型擦除,基于这种方法实现的泛型称为伪泛型。...泛型擦除前的例子 把这段Java代码编译成Class文件,然后再用字节码反编译后,將会发现泛型都不见了,又变回了Java泛型出现之前的写法,泛型类型都变回了原类型。...自动装箱: 拆箱遍历循环 自动装箱: 拆箱遍历循环编译后 遍历循环则把代码还原成了迭代器的实现,这也是为何遍历循环需要被遍历的类实现Iterable接口的原因。

54830

Java泛型擦除

泛型和类型擦除 foreach语法 1. 泛型和类型擦除 泛型的本质是参数化类型,这个参数类型可被用在接口、类、方法上,分别称为泛型接口、泛型类、泛型方法。...1.1 为什么要引入泛型 没有泛型的Java只能通过Object强制转换成具体的类型,这种写法极其不美观,而且需要程序员去保证这个强转操作的正确性,否则极有可能在虚拟机运行的时候抛出ClassCastException...1.2 类型擦除 Java中的泛型是伪泛型,泛型只会在程序源码中存在,在编译后的class文件中,参数类型将会被抹除(类型擦除)。...Java编译器会自动将泛型擦除,将强转添加。...Java中除了上述两种语法糖,还有诸如内部类、自动装箱、自动拆箱、try语句定义和关闭资源等,分析方法均如上述,感兴趣的读者可以自行分析。 本期的Java语法糖介绍到这,我们下期再见!!!

73520

Java语法糖之泛型类型擦除

1 泛型类型擦除 泛型,JDK 1.5新特性,本质是参数化类型(Parametersized Type) 的应用,即所操作的数据类型被指定为一个参数。...Java语言中的泛型则不一样,它只在程序源码中存在,在编译后的字节码文件中,就已经替换为原来的原生类型(Raw Type) ,并在相应地方插入强制转换代码。...因此,对运行期的Java来说Araylist、Aralist是同一个类。所以泛型是Java语言的一颗语法糖Java称为类型擦除,基于这种方法实现的泛型称为伪泛型。...泛型擦除前的例子 [d347cb20042fbdffec7af32a5cef72b4.png] 把这段Java代码编译成Class文件,然后再用字节码反编译后,將会发现泛型都不见了,又变回了Java泛型出现之前的写法...自动装箱: 拆箱遍历循环 [ac763ea9a774a914879ccd27cbdd0498.png] 自动装箱: 拆箱遍历循环编译后[51a73df3f1ed22fef870234c2ae178a6

1K70

java类型擦除知多少

在编程语言中,类型擦除是加载时过程,在程序运行时执行之前,通过该过程从程序中删除显式类型注释。不需要程序伴随类型的操作语义称为类型擦除语义,类型传递语义形成对比。...赋予类型擦除语义的可能性是一种抽象原则,确保程序的运行时执行不依赖于类型信息。----维基百科 泛型被引入 Java 语言以在编译时提供更严格的类型检查并支持泛型编程。...为了实现泛型,Java 编译器将类型擦除应用于: 如果类型参数是无界的,则将泛型类型中的所有类型参数替换为其边界或Object 。因此,生成的字节码只包含普通的类、接口和方法。...必要时插入类型转换以保持类型安全。 生成桥方法以保留扩展泛型类型中的多态性。 类型擦除确保不会为参数化类型创建新类;因此,泛型不会产生运行时开销。...在类型擦除过程中,Java 编译器擦除所有类型参数,如果类型参数是有界的,则将每个类型参数替换为其第一个边界,如果类型参数是无界的,则将其替换为Object。

59330

Java泛型类型擦除问题

Java泛型类型擦除问题 以前就了解过Java泛型的实现是不完整的,最近在做一些代码重构的时候遇到一些Java泛型类型擦除的问题,简单的来说,Java泛型中所指定的类型在编译时会将其去除,因此List<...因此java泛型只能做到编译期检查的功能,运行期间就不能保证类型安全。...,并提供了方法将string spec 反序列化成相应的类型,比较理想的方式是在反序列化的方法中能够获取到参数类型 T 的实际类型,理论上运行时Spec类型是确定了,因此T也应该是确定的,但是因为类型擦除...: class java.lang.Class cannot be cast to class java.lang.reflect.ParameterizedType (java.lang.Class...and java.lang.reflect.ParameterizedType are in module java.base of loader 'bootstrap') 有两种办法来绕过这个问题 第一种比较简单

97820

带你深挖Java泛型类型擦除以及类型擦除带来的问题

1.Java泛型的实现方法:类型擦除 大家都知道,Java的泛型是伪泛型,这是因为Java在编译期间,所有的泛型信息都会被擦掉,正确理解泛型概念的首要前提是理解类型擦除。...Java编译器会在编译时尽可能的发现可能出错的地方,但是仍然无法在运行时刻出现的类型转换异常的情况,类型擦除也是Java的泛型C++模板机制实现方式之间的重要区别。...所以为了避免这种极易出现的错误,Java不允许进行这样的引用传递。(这也是泛型出现的原因,就是为了解决类型转换的问题,我们不能违背它的初衷)。...3-2.自动类型转换 因为类型擦除的问题,所以所有的泛型类型变量最后都会被替换为原始类型。 既然都被替换为原始类型,那么为什么我们在获取的时候,不需要进行强制类型转换呢?...setValue方法是为了解决类型擦除多态之间的冲突。

3.7K21

带你深挖Java泛型类型擦除以及类型擦除带来的问题

1.Java泛型的实现方法:类型擦除 大家都知道,Java的泛型是伪泛型,这是因为Java在编译期间,所有的泛型信息都会被擦掉,正确理解泛型概念的首要前提是理解类型擦除。...Java编译器会在编译时尽可能的发现可能出错的地方,但是仍然无法在运行时刻出现的类型转换异常的情况,类型擦除也是Java的泛型C++模板机制实现方式之间的重要区别。...所以为了避免这种极易出现的错误,Java不允许进行这样的引用传递。(这也是泛型出现的原因,就是为了解决类型转换的问题,我们不能违背它的初衷)。...3-2.自动类型转换 因为类型擦除的问题,所以所有的泛型类型变量最后都会被替换为原始类型。 既然都被替换为原始类型,那么为什么我们在获取的时候,不需要进行强制类型转换呢?...setValue方法是为了解决类型擦除多态之间的冲突。

1.5K40

Java泛型,你了解类型擦除吗?

只不过要进行强制转换。...这是因为,泛型信息只存在于代码编译阶段,在进入 JVM 之前,泛型相关的信息会被擦除掉,专业术语叫做类型擦除。 通俗地讲,泛型类和普通类在 java 虚拟机内是没有什么特别的地方。...类型擦除带来的局限性 类型擦除,是泛型能够之前的 java 版本代码兼容共存的原因。但也因为类型擦除,它会抹掉很多继承相关的特性,这是它带来的局限性。...而类型擦除,是泛型能够之前的 java 版本代码兼容共存的原因。 可量也正因为类型擦除导致了一些隐患局限。 但,我还是要建议大家使用泛型,如官方文档所说的,如果可以使用泛型的地方,尽量使用泛型。...毕竟它抽离了数据类型代码逻辑,本意是提高程序代码的简洁性和可读性,并提供可能的编译时类型转换安全检测功能。 类型擦除不是泛型的全部,但是它却能很好地检测我们对于泛型这个概念的理解程度。

2.2K20
领券