Java 为什么不支持泛型数组?
2022/1/26 9:04:30
本文主要是介绍Java 为什么不支持泛型数组?,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
问题
首先对比一下以下两段代码,都是声明两个数组,其中一个使用泛型,一个不使用泛型。使用泛型的一个编译失败,由此可知,Java 不支持泛型数组。
List<Integer>[] list = new LinkedList<Integer>[10];// 无法通过编译
List[] list = new LinkedList[10];
原因
Java 泛型通过类型擦除实现,编译时类型参数就会被擦掉。例如:声明一个 List<String>,一个 List<Integer>,编译后,都变为 List,并且在 JVM 中是同一个 class 对象 List.class。
List<String> stringList = new LinkedList<String>(); List<Integer> integerList = new LinkedList<Integer>(); // 输出true System.out.println(stringList.getClass()==integerList.getClass());
假设 Java 允许使用泛型数组,我们看看有什么问题。
List<String>[] list = new LinkedList<String>[10];
经过类型擦除后。
List[] list = new LinkedList[10];
接下来我们就可以往数组中放东西了。
list[1] = new LinkedList<String>(); list[0] = new LinkedList<Integer>(); // 编译通过
这里就出现问题了,声明的是 LinkedList<String> 类型的数组,但是居然成功放入了一个 LinkedList<Integer>(),这与 Java 协变数组类型有关,出现了类型安全问题,所以 Java 中不支持泛型数组。
创建泛型数组的唯一方式,是先创建一个擦除类型的数组,然后使用强制类型转型,这种类型转换将产生一个关于未检验的类型转换的编译警告。
List<String>[] list = (LinkedList<String>[]) new LinkedList[10]; list[0] = new LinkedList<String>(); list[1] = new LinkedList<Integer>();// 报错
这篇关于Java 为什么不支持泛型数组?的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-05-15鸿蒙生态设备数量超8亿台
- 2024-05-13TiDB + ES:转转业财系统亿级数据存储优化实践
- 2024-05-09“2024鸿蒙零基础快速实战-仿抖音App开发(ArkTS版)”实战课程已上线
- 2024-05-09聊聊如何通过arthas-tunnel-server来远程管理所有需要arthas监控的应用
- 2024-05-09log4j2这么配就对了
- 2024-05-09nginx修改Content-Type
- 2024-05-09Redis多数据源,看这篇就够了
- 2024-05-09Google Chrome驱动程序 124.0.6367.62(正式版本)去哪下载?
- 2024-05-09有没有大佬知道这种数据应该怎么抓取呀?
- 2024-05-09这种运行结果里的10.100000001,怎么能最快改成10.1?