由于类型擦除的概念,泛型数组在 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>
通过在强制转换中显式指定泛型类型信息,我们通知编译器有关数组元素的预期类型。这满足了编译器的类型安全要求。
或者,我们可以使用列表列表:
<code class="java">ArrayList<ArrayList<Key>> b = new ArrayList<ArrayList<Key>>();</code>
这是合法的,因为ArrayList 不是数组。外部 ArrayList 中的每个元素都是一个 ArrayList
编译器对泛型数组的限制是为了强制类型安全。如果没有这些检查,通过将不同类型的列表分配给通用列表数组,很容易引入微妙的运行时错误。
通过了解编译器行为背后的原因,我们可以就何时以及如何做出明智的决定使用通用数组和列表列表,确保代码正确性和可维护性。
以上是为什么我无法在 Java 中声明通用列表数组?的详细内容。更多信息请关注PHP中文网其他相关文章!