【问题标题】:Why generic array creation works in some circumstances为什么通用数组创建在某些情况下有效
【发布时间】:2020-02-22 15:57:30
【问题描述】:

众所周知,Java 不支持创建泛型数组。例如,下面的代码在构建过程中会报错generic array creation

Deque<TreeNode>[] stacks = {new ArrayDeque(), new ArrayDeque()};

但是,下面创建这样一个数组的代码是有效的,

Deque<TreeNode>[] stacks = new ArrayDeque[2];

我想知道为什么这两种逻辑之间的行为不同的原因。

【问题讨论】:

  • 如果您不忽略ArrayDeque 的泛型类型,您的第二个示例也会失败。 Java 在第一个示例中没有忽略它,并将其添加到数组初始化器中。
  • @Tom 在高层次上,您的解释对您来说很有意义。但是你能给我一个例子,说明如何通过更新第二个代码“不忽略 ArrayDeque 的泛型”吗?另一个问题是,第二个代码在 Java 中是否被认为是一种不好的做法?
  • 您似乎已经知道泛型类型,因为您将它们用于Deque&lt;TreeNode&gt;,因此更新您的代码以在秒示例中不忽略应该是相当明显的new ArrayDeque&lt;TreeNode&gt;[2]
  • @CodingFanSteve 不确定您是否意识到,但第二个示例将有 2 个 null 条目。
  • @jbx 是的,当我做第二个 Code Pattern 时,我通常使用 Arrays.setAll() 来初始化数组。

标签: java generics deque


【解决方案1】:

当他们说“parameterised array creation is not allowed”时,他们的意思是不允许这种特定的语法:

new T<U>[]

其中TU 是类型。请注意,这与数组的声明类型无关。将数组声明Deque&lt;TreeNode&gt; 类型是完全没问题的,所以问题出在= 的右侧,而不是左侧。

在第二种情况下,你在做new ArrayDeque[2],显然没有违反规则,因为它不是new T&lt;U&gt;[]的形式。

在第一种情况下,您正在使用数组初始化器,让编译器推断您尝试创建的数组类型,并且编译器通过查看左侧来推断。所以第一行相当于:

Deque<TreeNode>[] stacks = new Deque<TreeNode>[] {new ArrayDeque(), new ArrayDeque()};

这是不允许的。格式为new T&lt;U&gt;[]

【讨论】:

  • @Tom 这是基本的模式匹配,不是吗?我试图澄清更多。你怎么看?
  • 嗯,我期待更多关于ArrayDeque 是一个泛型类型,显式地忽略泛型,因此完全停用该数组的泛型类型检查。但我猜它很好:D
猜你喜欢
  • 1970-01-01
  • 2019-12-27
  • 1970-01-01
  • 2017-12-05
  • 2014-01-17
  • 1970-01-01
  • 2021-07-31
  • 2019-10-31
  • 2022-12-03
相关资源
最近更新 更多