简介

泛型是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相关推荐

  1. java jceks 密钥_Java中不同类型的密钥库(Keystore) – 概述

    阅读: 877 密钥库是用于存储加密密钥和证书的存储工具 ,最常用于SSL通信,以证明服务器和客户端的身份.密钥库可以是文件或硬件设备.有三种类型的条目可以存储在密钥库中,取决于密钥库的类型,这三种类 ...

  2. java long类型大小_java中long类型占多少字节

    所谓的占用字节数 就是申请内存的时候所占的空间大小. long 8字节 最小值是 -9,223,372,036,854,775,808(-2^63): 最大值是 9,223,372,036,854,7 ...

  3. java set类_java中set类型集合解析(一)

    集合的体系: -----------------Collection  单例集合接口 ----------------------List 如果实现的是List接口的集合,具备有序,可重复的特性 -- ...

  4. java long初始化_java中long类型的变量想要初始化其值为空,要怎么实现?

    展开全部 Long long=null. 基本语法 编写Java程序时,应注意以下几点:大小写敏感:32313133353236313431303231363533e78988e69d83313333 ...

  5. java boolean几个字节_Java中boolean类型到底占用多少个字节?

    1.时间:2017-07-03 07:37:06YuanMxy 2.问题描述:今天在复习java基础的时候发现一小问题,Java中boolean类型到底占用多少个字节? 3.问题解答: (1)什么是b ...

  6. java 无符号 类型_java中符号类型和无符号类型的问题分析

    一 参考博文 二 java中的无符号数和有符号数 在计算机中,可以区分正负的类型,称为有符号类型,无正负的类型,称为无符号类型. 使用二进制中的最高位表示正负 计算机中用补码表示数值:另外,用二进制的 ...

  7. java double 小数点后两位小数_Java中double类型的数据精确到小数点后两位

    Java中double类型的数据精确到小数点后两位 多余位四舍五入,四种方法 一: double f = 111231.5585; BigDecimal b = newBigDecimal(f);do ...

  8. java 日期是否合法_java 中 Date 类型快判断日期是否合法.

    // 如果日期不合法,则抛异常try {String date_str = 5555-22-33;SimpleDateFormat format=new SimpleDateFormat(yyyy-M ...

  9. java 内部变量_java 中的内置数据类型

    1,  基本数据类型 Java是强类型语言, 对于每一种数据都定义了类型,基本数据类型分为数值型,字符型,布尔型.数值型又分为了整型和浮点型. 整型又分为byte, int, short long. ...

最新文章

  1. TEEC_Context和TEEC_InitializeContext介绍
  2. Windows保护模式学习笔记(十)—— TLB
  3. 【渝粤题库】国家开放大学2021春2508学前儿童语言教育题目
  4. python修饰器原理_Python修饰器的函数式编程
  5. java_version干什么的_java类中serialVersionUID的作用及其使用
  6. 搭载Apple芯片的Mac如何使用macOS恢复?
  7. 关于火狐插件总结。。。
  8. Mac 版pr 破解教程,亲测可行。
  9. 计算机断网后显示配置0%,电脑断网后自动报警提醒怎么设置
  10. Simulink仿真入门到精通(二) Simulink模块
  11. python 单因子方差分析_假设检验之F检验-方差分析
  12. 网易公开课中英字幕文件合并代码
  13. 多元线性回归预测:餐馆营业额与多因素实战
  14. module java.base does not “opens java.lang“ to module spring.core
  15. win10 系统开启自带热点,手机无法连接(连接超时)
  16. 110报警声+单片机c语言,基于单片机的红外报警系统设计毕业论文.docx
  17. 最新注册谷歌账号遇到此号码无法验证的解决办法_看我如何成功注册gmail
  18. layui中表格嵌套表格
  19. Psychopy学习笔记上|online流程,unexpected token
  20. Paypal+本地支付,是跨境外贸收款最好的解决方案!

热门文章

  1. 学了python究竟有什么用,实际应用场景有哪些?我整理了8个应用领域
  2. 新浪微博互粉php,新浪微博粉丝服务平台配置教程
  3. 业务运维离不开腾讯数据库TcaplusDB事务管理
  4. MCS-51单片机的定时器/计数器
  5. 将RGB数据写入BMP位图文件
  6. 决策树算法面试问题汇总
  7. php怎么调用麦克风,使用麦克风时要知道的10大声学知识
  8. 走向人生巅峰?这份自由程序员速成宝典你值得拥有...
  9. 含泪整理最优质耳机免抠元素素材,你想要的这里都有
  10. 所有的双色球开奖记录都在这里了