众所周知,Java 不支持泛型数组创建。例如,以下代码将在构建期间因通用数组创建
而出错,
Deque<TreeNode>[] stacks = {new ArrayDeque(), new ArrayDeque()};
但是,创建此类数组的以下代码是有效的,
Deque<TreeNode>[] stacks = new ArrayDeque[2];
我想知道这两种逻辑之间的行为不同背后的基本原理。
最佳答案
当他们说“parameterised array creation is not allowed ”时,他们的意思是不允许这种特定的语法:
new T<U>[]
哪里T
和U
是类型。请注意,这与数组的声明类型无关。 声明一个数组为 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/