java 类型擦除_java中的类型擦除type erasure
简介
泛型是java从JDK 5开始引入的新特性,泛型的引入可以让我们在代码编译的时候就强制检查传入的类型,从而提升了程序的健壮度。
泛型可以用在类和接口上,在集合类中非常常见。本文将会讲解泛型导致的类型擦除。
举个例子
我们先举一个最简单的例子:
@Slf4j
public class TypeErase {
public static void main(String[] args) {
ArrayList stringArrayList = new ArrayList();
stringArrayList.add("a");
stringArrayList.add("b");
action(stringArrayList);
}
public static void action(ArrayList al){
for(Object o: al)
log.info("{}",o);
}
}
上面的例子中,我们定义了一个ArrayList,其中指定的类型是String。
然后调用了action方法,action方法需要传入一个ArrayList,但是这个list的类型是Object。
乍看之下好像没有问题,因为String是Object的子类,是可以进行转换的。
但是实际上代码编译出错:
Error:(18, 16) java: 不兼容的类型: java.util.ArrayList无法转换为java.util.ArrayList
原因
上面例子的原因就是类型擦除(type erasure)。java中的泛型是在编译时做检测的。而编译后生成的二进制文件中并不保存类型相关的信息。
上面的例子中,编译之后不管是ArrayList 还是ArrayList 都会变成ArrayList。其中的类型Object/String对JVM是不可见的。
但是在编译的过程中,编译器发现了两者的类型不同,然后抛出了错误。
解决办法
要解决上面的问题,我们可以使用下面的办法:
public static void actionTwo(ArrayList> al){
for(Object o: al)
log.info("{}",o);
}
通过使用通配符?,可以匹配任何类型,从而通过编译。
但是要注意这里actionTwo方法中,因为我们不知道传入的类型到底是什么,所以我们不能在actionTwo中添加任何元素。
总结
从上面的例子我们可以看出,ArrayList并不是ArrayList的子类。如果一定要找出父子关系,那么ArrayList是Collection的子类。
但是Object[] objArray是String[] strArr的父类。因为对Array来说,其具体的类型是已知的。
本文作者:flydean程序那些事
本文来源:flydean的博客
欢迎关注我的公众号:程序那些事,更多精彩等着您!
java 类型擦除_java中的类型擦除type erasure相关推荐
- java jceks 密钥_Java中不同类型的密钥库(Keystore) – 概述
阅读: 877 密钥库是用于存储加密密钥和证书的存储工具 ,最常用于SSL通信,以证明服务器和客户端的身份.密钥库可以是文件或硬件设备.有三种类型的条目可以存储在密钥库中,取决于密钥库的类型,这三种类 ...
- java long类型大小_java中long类型占多少字节
所谓的占用字节数 就是申请内存的时候所占的空间大小. long 8字节 最小值是 -9,223,372,036,854,775,808(-2^63): 最大值是 9,223,372,036,854,7 ...
- java set类_java中set类型集合解析(一)
集合的体系: -----------------Collection 单例集合接口 ----------------------List 如果实现的是List接口的集合,具备有序,可重复的特性 -- ...
- java long初始化_java中long类型的变量想要初始化其值为空,要怎么实现?
展开全部 Long long=null. 基本语法 编写Java程序时,应注意以下几点:大小写敏感:32313133353236313431303231363533e78988e69d83313333 ...
- java boolean几个字节_Java中boolean类型到底占用多少个字节?
1.时间:2017-07-03 07:37:06YuanMxy 2.问题描述:今天在复习java基础的时候发现一小问题,Java中boolean类型到底占用多少个字节? 3.问题解答: (1)什么是b ...
- java 无符号 类型_java中符号类型和无符号类型的问题分析
一 参考博文 二 java中的无符号数和有符号数 在计算机中,可以区分正负的类型,称为有符号类型,无正负的类型,称为无符号类型. 使用二进制中的最高位表示正负 计算机中用补码表示数值:另外,用二进制的 ...
- java double 小数点后两位小数_Java中double类型的数据精确到小数点后两位
Java中double类型的数据精确到小数点后两位 多余位四舍五入,四种方法 一: double f = 111231.5585; BigDecimal b = newBigDecimal(f);do ...
- java 日期是否合法_java 中 Date 类型快判断日期是否合法.
// 如果日期不合法,则抛异常try {String date_str = 5555-22-33;SimpleDateFormat format=new SimpleDateFormat(yyyy-M ...
- java 内部变量_java 中的内置数据类型
1, 基本数据类型 Java是强类型语言, 对于每一种数据都定义了类型,基本数据类型分为数值型,字符型,布尔型.数值型又分为了整型和浮点型. 整型又分为byte, int, short long. ...
最新文章
- TEEC_Context和TEEC_InitializeContext介绍
- Windows保护模式学习笔记(十)—— TLB
- 【渝粤题库】国家开放大学2021春2508学前儿童语言教育题目
- python修饰器原理_Python修饰器的函数式编程
- java_version干什么的_java类中serialVersionUID的作用及其使用
- 搭载Apple芯片的Mac如何使用macOS恢复?
- 关于火狐插件总结。。。
- Mac 版pr 破解教程,亲测可行。
- 计算机断网后显示配置0%,电脑断网后自动报警提醒怎么设置
- Simulink仿真入门到精通(二) Simulink模块
- python 单因子方差分析_假设检验之F检验-方差分析
- 网易公开课中英字幕文件合并代码
- 多元线性回归预测:餐馆营业额与多因素实战
- module java.base does not “opens java.lang“ to module spring.core
- win10 系统开启自带热点,手机无法连接(连接超时)
- 110报警声+单片机c语言,基于单片机的红外报警系统设计毕业论文.docx
- 最新注册谷歌账号遇到此号码无法验证的解决办法_看我如何成功注册gmail
- layui中表格嵌套表格
- Psychopy学习笔记上|online流程,unexpected token
- Paypal+本地支付,是跨境外贸收款最好的解决方案!