为什么通用数组创建在某些情况下有效
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>[]
其中 T
和 U
是类型。请注意,这与数组的 声明类型 无关。 声明 类型为 Deque<TreeNode>
的数组完全没问题,所以问题出在 =
的右侧,而不是左侧。
在第二种情况下,你做的是new ArrayDeque[2]
,显然没有违反规则,因为它不是new T<U>[]
.
的形式
在第一种情况下,您使用的是 数组初始化程序 ,让编译器推断您尝试创建的数组类型,编译器通过查看左手边。所以第一行相当于:
Deque<TreeNode>[] stacks = new Deque<TreeNode>[] {new ArrayDeque(), new ArrayDeque()};
这是不允许的。它的形式是 new T<U>[]
.
众所周知,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>[]
其中 T
和 U
是类型。请注意,这与数组的 声明类型 无关。 声明 类型为 Deque<TreeNode>
的数组完全没问题,所以问题出在 =
的右侧,而不是左侧。
在第二种情况下,你做的是new ArrayDeque[2]
,显然没有违反规则,因为它不是new T<U>[]
.
在第一种情况下,您使用的是 数组初始化程序 ,让编译器推断您尝试创建的数组类型,编译器通过查看左手边。所以第一行相当于:
Deque<TreeNode>[] stacks = new Deque<TreeNode>[] {new ArrayDeque(), new ArrayDeque()};
这是不允许的。它的形式是 new T<U>[]
.