泛型(Generic) 类型擦除

news/2024/11/7 20:45:39/

什么是类型擦除

泛型是 Java 1.5 版本才引进的概念,在这之前是没有泛型的概念的,但是泛型代码能够很好地和之前版本的代码很好地兼容。这是因为,泛型信息只存在于代码编译阶段,在进入 JVM 之前,与泛型相关的信息会被擦除掉,专业术语叫做"类型擦除"。


判断ArrayList<String>ArrayList<Integer>是否相等?

ArrayList<String> a = new ArrayList<String>();
ArrayList<Integer> b = new ArrayList<Integer>();Class c1 = a.getClass();
Class c2 = b.getClass();System.out.println(c1 == c2); // true

输出的结果是 true。因为无论对于 ArrayList<String>还是 ArrayList<Integer>,它们的 Class类型 都是 ArrayList.class

那它们声明时指定的 String 和 Integer 的作用到底体现在哪里呢?
体现在类编译的时候。当 JVM 进行类编译时,会进行泛型检查,如果一个集合被声明为 String 类型,那么它往该集合存取数据的时候就会对数据进行判断,从而避免存入或取出错误的数据。

Array中可以用泛型吗?
不可以。这也是为什么 Joshua Bloch《Effective Java》 一书中建议使用 List 来代替 Array,因为
List 可以提供编译期的类型安全保证,而 Array 却不能。


判断MyClass<String>MyClass<Integer>是否相等?

class MyClass<T> {private T message;...
}MyClass<String> myClass1 = new MyClass<>();
MyClass<Integer> myClass2 = new MyClass<>();System.out.println(myClass1.getClass() == myClass2.getClass()); //true    

打印的结果为 true 是因为 MyClass<String>MyClass<Integer> 在 jvm 中的 Class 都是 MyClass.class


类型上限

在泛型类被类型擦除的时候,之前泛型类中的 类型参数 部分如果没有指定上限,则会被转译成普通的Object类型,如果指定了上限则类型参数就被替换成类型上限

class MyClass<T, E> {private T message;private E text;...
}
        Class cls = myClass1.getClass();Field[] fields = cls.getDeclaredFields();for (Field field : fields) {System.out.println(field.getType());}//class java.lang.Object//class java.lang.Object
class MyClass<T, E extends Number> {private T message;private E text;...
}
        MyClass<String, Integer> myClass1 = new MyClass<>();Class cls = myClass1.getClass();Field[] fields = cls.getDeclaredFields();for (Field field : fields) {System.out.println(field.getType());}//class java.lang.Object//class java.lang.Number

http://www.ppmy.cn/news/67979.html

相关文章

算法修炼之练气篇——练气二层

博主&#xff1a;命运之光 专栏&#xff1a;算法修炼之练气篇 前言&#xff1a;每天练习五道题&#xff0c;炼气篇大概会练习200道题左右&#xff0c;题目有C语言网上的题&#xff0c;也有洛谷上面的题&#xff0c;题目简单适合新手入门。&#xff08;代码都是命运之光自己写的…

电商如何利用API接口获取商品信息数据

随着电商和互联网的快速发展&#xff0c;API&#xff08;应用程序编程接口&#xff09;的重要性也越来越明显。API接口可以让不同系统之间进行数据交互和通信&#xff0c;进而实现更高效的业务协同和数据共享。在电商业务中&#xff0c;API可以帮助企业实现多个业务系统之间的数…

由浅入深理解java集合(三)——集合 List

一、List集合 List集合判断元素相等的标准 List判断两个对象相等只要通过equals()方法比较返回true即可&#xff08;关于equals()方法的详解可以参考第二篇文章中的内容&#xff09;。 下面以用代码具体展示。 创建一个Book类&#xff0c;并重写equals()方法&#xff0c;如果两…

FISCO BCOS(三十五)———Python Sdk linux 环境控制台使用

注:按照之前的一键部署所有流程先走完,再做以下操作,注意我们的操作全部在ubuntu上进行,不考虑其他环境(我把坑踩完了,按照我的来不会采坑) pythonsdk Gitee地址:https://gitee.com/wei_hong_liang/python-sdk?_from=gitee_search#python-sdk1、安装python-sdk依赖软件 …

sorna python3 调用,python 获取sonarqube数据

1.sonarqube是一款代码分析的工具&#xff0c;通过soanrScanner扫描后的数据传递给sonarqube进行分析 2.sonarqube社区版没有对c类代码的分析&#xff0c;但是可以找到一个开源的包&#xff0c;安装即可&#xff0c;扫描的话可以使用cppcheck来进行扫描 安装python对于sonarqu…

移动端网站SEO优化怎么设计才更符合?

网站设计对于用户的视觉体验而言是至关重要的&#xff0c;当用户点进你的网站时&#xff0c;如果你的网站没有能让人感到眼前一亮&#xff0c;或者说让人感觉视觉上很不舒服&#xff0c;阅读起来困难重重&#xff0c;那么你的网站可以说毫无疑问是失败的&#xff0c;不仅会赶跑…

2023五一杯B题:快递需求分析问题

题目 网络购物作为一种重要的消费方式&#xff0c;带动着快递服务需求飞速增长&#xff0c;为我国经济发展做出了重要贡献。准确地预测快递运输需求数量对于快递公司布局仓库站点、节约存储成本、规划运输线路等具有重要的意义。附件1、附件2、附件3为国内某快递公司记录的部分…

C++中MAC地址与字符数组的相互转换详解

目录 引言&#xff1a;MAC地址与字符数组的定义MAC地址转换为字符数组字符数组转换为MAC地址 总结 引言&#xff1a; 在网络编程中&#xff0c;MAC地址是一个重要的标识符。有时候我们需要在C程序中进行MAC地址与字符数组之间的转换。本篇博文将详细介绍如何在C中实现MAC地址与…