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

Why generic array creation works in some circumstances

众所周知,Java 不支持创建通用数组。例如,下面的代码在构建过程中会出现 generic array creation 错误,

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>[].