众所周知,Java不支持通用数组创建。例如,以下代码在构建过程中将以generic array creation
出现错误,
Deque<TreeNode>[] stacks = {new ArrayDeque(), new ArrayDeque()};
但是,以下创建这样的数组的代码有效,
Deque<TreeNode>[] stacks = new ArrayDeque[2];
我想知道这两种逻辑之间的行为为何不同的背后原理。
new T<U>[]
其中T
和U
是类型。请注意,这与数组的
declared type没有关系。这是不允许的。它的格式为declare类型为
在第二种情况下,您正在执行Deque<TreeNode>
的数组是完全可以的,因此问题出在=
的右侧,而不是左侧。new ArrayDeque[2]
,显然没有违反规则,因为它不是new T<U>[]
形式。在第一种情况下,您使用的是array initialiser
,使编译器推断出您要创建的数组类型,而编译器则通过查看左侧来进行此操作。因此,第一行等效于:
Deque<TreeNode>[] stacks = new Deque<TreeNode>[] {new ArrayDeque(), new ArrayDeque()};
new T<U>[]
。