Java 为什么不支持泛型数组?

Java 为什么不支持泛型数组?

问题

首先对比一下以下两段代码,都是声明两个数组,其中一个使用泛型,一个不使用泛型。使用泛型的一个编译失败,由此可知,Java 不支持泛型数组。

List[] list = new LinkedList[10];// 无法通过编译

List[] list = new LinkedList[10];

原因

Java 泛型通过类型擦除实现,编译时类型参数就会被擦掉。例如:声明一个 List,一个 List,编译后,都变为 List,并且在 JVM 中是同一个 class 对象 List.class。

List stringList = new LinkedList();

List integerList = new LinkedList();

// 输出true

System.out.println(stringList.getClass()==integerList.getClass());

假设 Java 允许使用泛型数组,我们看看有什么问题。

List[] list = new LinkedList[10];

经过类型擦除后。

List[] list = new LinkedList[10];

接下来我们就可以往数组中放东西了。

list[1] = new LinkedList();

list[0] = new LinkedList(); // 编译通过

这里就出现问题了,声明的是 LinkedList 类型的数组,但是居然成功放入了一个 LinkedList(),这与 Java 协变数组类型有关,出现了类型安全问题,所以 Java 中不支持泛型数组。

创建泛型数组的唯一方式,是先创建一个擦除类型的数组,然后使用强制类型转型,这种类型转换将产生一个关于未检验的类型转换的编译警告。

List[] list = (LinkedList[]) new LinkedList[10];

list[0] = new LinkedList();

list[1] = new LinkedList();// 报错

相关推荐

我的世界命名牌怎么做-我的世界命名牌有什么用
365bet手机网址多少

我的世界命名牌怎么做-我的世界命名牌有什么用

📅 07-13 👁️ 1067
欧路词典|英汉-汉英词典 then是什么意思
365bet英超

欧路词典|英汉-汉英词典 then是什么意思

📅 08-29 👁️ 877
音响海淘网站哪个最靠谱,什么网站可以海淘音响