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>();// 报错
posted @   Acx7  阅读(320)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
点击右上角即可分享
微信分享提示