java - 为什么通用数组创建在某些情况下有效

标签 java generics deque

众所周知,Java 不支持泛型数组创建。例如,以下代码将在构建期间因通用数组创建而出错,

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

但是,创建此类数组的以下代码是有效的,

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

我想知道这两种逻辑之间的行为不同背后的基本原理。

最佳答案

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

new T<U>[]

哪里TU是类型。请注意,这与数组的声明类型无关。 声明一个数组为 Deque<TreeNode> 类型是完全可以的。 ,所以问题出在 = 的右侧,不是左边。

在第二种情况下,你正在做 new ArrayDeque[2] ,显然没有违反规则,因为它的形式不是 new T<U>[] .

在第一种情况下,您使用数组初始值设定项,使编译器推断您尝试创建的数组类型,编译器通过查看左侧来完成此操作。所以第一行相当于:

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

这是不允许的。其形式为 new T<U>[] .

关于java - 为什么通用数组创建在某些情况下有效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58573067/

相关文章:

java - 将构造函数类型参数放在 * 之前 * 类型是什么意思?

.net - 为什么接口(interface)契约(Contract)不适用于装配外部?

c++ - 为什么 push_back 或 push_front 使双端队列的迭代器无效?

c++ - std::deque 的排序是如何实现的?

java - 抽屉导航中的 LinearLayout

java - 文档移动错误

java - spring-data-rest 没有与 spring-mvc 完全集成

java - 这行代码发生了什么?

java - 编译带有边界的泛型时出错

c# - 在 PeekCompleted 方法中从 messageQueue 中出队