「java范型擦除」java 擦除

博主:adminadmin 2023-03-20 11:46:07 254

本篇文章给大家谈谈java范型擦除,以及java 擦除对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。

本文目录一览:

27.Android架构-泛型擦除机制

Java的泛型是JDK5新引入的特性,为了向下兼容,虚拟机其实是不支持泛型,所以Java实现的是一种

伪泛型机制,也就是说Java在编译期擦除了所有的泛型信息,这样Java就不需要产生新的类型到字节码,

所有的泛型类型最终都是一种原始类型,在Java运行时根本就不存在泛型信息。

使用ASM ByteCode Viewer查看他的字节码

可以看到我们设置的泛型R,被擦除为Object了,这就是泛型擦除

他的bytecode为

可以看到我们限定了泛型的类型,那么他的bytecode是什么样的?

可以看到虽然我们在Plate2中只定义了一个set get方法,但是bytecode中却有两个,其中一个get set方法添加了synthetic bridge 表示这是一个桥接方法,作用是为了保持多态性,可以看到 CHECKCAST java/lang/Comparable ,检查类型是否为Comparable,如果是的话再去调用上边的 public set(Ljava/lang/Comparable;)V 方法。可以这样理解, set(Ljava/lang/Object;)V 是从Plate接口实现来的, set(Ljava/lang/Comparable;)V 是他本身的,因为限定了类型范围

上边我们是通过showbytecode的方式查看的字节码,但是如果你点开类生成的class文件,你会发现,泛型既然被擦除了为什么在class中仍然可以看到?其实这里看到的只是签名而已,还保留了定义的格式,这样对分析字节码有好处。你甚至可以通过javap -c Plate2.class反编译class,你会发现,R还是能被看到,我们要看bytecode,通过showbytecode的方式比较真实

比如没有ArrayListint,只有ArrayListInteger.当类型擦除后,ArrayList的原始类中的类型变量(T)替换成Object,但Object类型不能 存放int值

因为擦除后,ArrayListString只剩下原始类型,泛型信息String不存在了,所有没法使用instanceof

因为泛型类中的泛型参数的实例化是在定义泛型类型对象 (比如ArrayListInteger)的时候指定的,而静态成员是不需要使用对象来调用的,所有对象都没创建,如何确定这个泛型参数是什么

因为擦除后两个equals方法变成一样的了

因为类型不确定

因为数组是协变( 在某些情况下,即使某个对象不是数组的基类型,我们也可以把它赋值给数组元素。这种属性叫做协变(covariance) ),擦除后就没法满足数组协变的原则

java什么叫泛型擦除

泛型是1.5中引入的一个新的概念,由于不用进行强制转换类型了,所以具有较高的安全性和易用性。因为泛型其实只是在编译器中实现的而虚拟机并不认识泛型类项,所以要在虚拟机中将泛型类型进行擦除。也就是说,在编译阶段使用泛型,运行阶段取消泛型,即擦除。 擦除是将泛型类型以其父类代替,如String 变成了Object等。其实在使用的时候还是进行带强制类型的转化,只不过这是比较安全的转换,因为在编译阶段已经确保了数据的一致性。

JAVA泛型有什么作用?泛型是实泛型还是伪泛型?

泛型好处:

泛型简单易用

类型安全 泛型的主要目标是实现java的类型安全。 泛型可以使编译器知道一个对象的限定类型是什么,这样编译器就可以在一个高的程度上验证这个类型

消除了强制类型转换 使得代码可读性好,减少了很多出错的机会

Java语言引入泛型的好处是安全简单。泛型的好处是在编译的时候检查类型安全,并且所有的强制转换都是自动和隐式的,提高代码的重用率。

泛型的实现原理

泛型的实现是靠类型擦除技术 类型擦除是在编译期完成的 也就是在编译期 编译器会将泛型的类型参数都擦除成它的限定类型,如果没有则擦除为object类型之后在获取的时候再强制类型转换为对应的类型。 在运行期间并没有泛型的任何信息,因此也没有优化。

泛型不考虑继承

List 类型 是否 可以 赋值为 List类型 ?

答案是不可以的

虽然说在赋值之后 String类型可以当做 Object类型使用 但是还是会出现问题

参考:《2020最新Java基础精讲视频教程和学习路线!》

class中的泛型为什么不会擦除?

java 泛型只是对编绎时有效,在运行时就被擦除了,起不到类型限制的作用。

比如 ListString list = new ArrayList();

那么 list 应该只能添加 String 类型的元素,添加 Integer 类型的就会报错,但是通过反射,能够添加 Integer 类型的元素。

测试代码:

java泛型擦除测试

不知道你说的”通过new Instance创造出各种不同类型“是什么意思,这应该和泛型没有关系。

java范型擦除的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于java 擦除、java范型擦除的信息别忘了在本站进行查找喔。