首页 > 解决方案 > Why generic array creation works in some circumstances

问题描述

As well-known, generic array creation is not supported in Java. For example, the following code will error out with generic array creation during the build,

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

However, the following code of creating such an array works,

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

I would like to know the rationale behind why the behaviors are different between these two logic.

标签: javagenericsdeque

解决方案


当他们说“不允许创建参数化数组”时,他们的意思是不允许这种特定的语法:

new T<U>[]

whereTUare 类型。请注意,这与数组的声明类型无关。将数组声明为 type完全没Deque<TreeNode>问题,所以问题出在 的右侧=,而不是左侧。

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

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

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

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


推荐阅读