首页  >  文章  >  Java  >  为什么我无法在 Java 中声明通用列表数组?

为什么我无法在 Java 中声明通用列表数组?

Susan Sarandon
Susan Sarandon原创
2024-11-03 13:05:03773浏览

Why Can't I Declare an Array of Generic Lists in Java?

泛型数组中的不完全擦除

由于类型擦除的概念,泛型数组在 Java 中提出了独特的挑战。本文探讨了两个看似相似的代码片段之间的差异,并揭示了编译器行为的根本原因。

语法和语义

考虑以下代码:

<code class="java">ArrayList<Key> a = new ArrayList<Key>();</code>

此代码编译没有问题,因为它创建了通用 ArrayList 的实例。但是,以下代码会导致编译错误:

<code class="java">ArrayList<Key>[] a = new ArrayList<Key>[10];</code>

揭开类型擦除

要理解这种差异,我们必须深入研究类型擦除的概念。在编译过程中,通用类型信息被删除,这意味着在运行时,只有原始类型(在本例中为 ArrayList)可用。

原始数组与特定类型列表

数组需要原始类型,而第一个代码片段创建对通用列表 (ArrayList) 的引用,而无需任何附加类型信息。因此,编译器在解析类型时没有问题。

但是,第二个代码片段尝试创建对泛型列表的引用数组。这违反了类型安全规则,因为数组不是参数类型,不能接受类型变量或参数化类型。

类型转换解决方案

要绕过此限制,我们可以按如下方式对数组进行类型转换:

<code class="java">ArrayList<Key>[] a = (ArrayList<Key>[]) new ArrayList[10];</code>

通过在强制转换中显式指定泛型类型信息,我们通知编译器有关数组元素的预期类型。这满足了编译器的类型安全要求。

列表列表(LL)方法

或者,我们可以使用列表列表:

<code class="java">ArrayList<ArrayList<Key>> b = new ArrayList<ArrayList<Key>>();</code>

这是合法的,因为ArrayList 不是数组。外部 ArrayList 中的每个元素都是一个 ArrayList,它是一个完全实例化的类型。

类型安全和基本原理

编译器对泛型数组的限制是为了强制类型安全。如果没有这些检查,通过将不同类型的列表分配给通用列表数组,很容易引入微妙的运行时错误。

通过了解编译器行为背后的原因,我们可以就何时以及如何做出明智的决定使用通用数组和列表列表,确保代码正确性和可维护性。

以上是为什么我无法在 Java 中声明通用列表数组?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn