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

简介: 首先对比一下以下两段代码,都是声明两个数组,其中一个使用泛型,一个不使用泛型。使用泛型的一个编译失败,由此可知,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>();// 报错




相关文章
|
3天前
|
Java 索引
[笔记] 疯狂JAVA讲义(第3版)第4章 流程控制与数组
[笔记] 疯狂JAVA讲义(第3版)第4章 流程控制与数组
|
3天前
|
Java 编译器
[笔记] 疯狂JAVA讲义(第3版)第9章 泛型
[笔记] 疯狂JAVA讲义(第3版)第9章 泛型
|
3天前
|
安全 Java
深入理解 Java 泛型工厂方法:类型安全与灵活性的结合
深入理解 Java 泛型工厂方法:类型安全与灵活性的结合
7 1
|
3天前
|
安全 Java 编译器
Java 泛型详解:全面掌握类型安全与灵活性的利器
Java 泛型详解:全面掌握类型安全与灵活性的利器
8 1
|
3天前
|
安全 Java 开发者
详解 Java 泛型:核心概念与实用示例
详解 Java 泛型:核心概念与实用示例
5 1
|
4天前
|
存储 缓存 安全
Java基础15-深入理解Java中的泛型(二)
Java基础15-深入理解Java中的泛型(二)
11 4
|
4天前
|
设计模式 Java 编译器
Java基础15-深入理解Java中的泛型(一)
Java基础15-深入理解Java中的泛型(一)
13 0
|
10天前
|
Java
(JAVA)找出数组中不重复或者重复的数字
(JAVA)找出数组中不重复或者重复的数字
|
11天前
|
Java API 容器
Java泛型的继承和通配符
Java泛型的继承和通配符
10 1
|
12天前
|
存储 算法 Java
【经典算法】 leetcode88.合并排序的数组(Java/C/Python3实现含注释说明,Easy)
【经典算法】 leetcode88.合并排序的数组(Java/C/Python3实现含注释说明,Easy)
8 1