java - 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.
解决方案
当他们说“不允许创建参数化数组”时,他们的意思是不允许这种特定的语法:
new T<U>[]
whereT
和U
are 类型。请注意,这与数组的声明类型无关。将数组声明为 type完全没Deque<TreeNode>
问题,所以问题出在 的右侧=
,而不是左侧。
在第二种情况下,您正在做new ArrayDeque[2]
,显然没有违反规则,因为它不在形式中new T<U>[]
。
在第一种情况下,您正在使用数组初始化程序,使编译器推断您尝试创建的数组类型,编译器通过查看左侧来执行此操作。所以第一行相当于:
Deque<TreeNode>[] stacks = new Deque<TreeNode>[] {new ArrayDeque(), new ArrayDeque()};
这是不允许的。它的形式是new T<U>[]
。
推荐阅读
- spring-boot - 按下“取消链接用户”按钮后,Keycloak 出现“用户名或密码错误”错误
- java - 未检测到命名参数
- android - 如何在一个 Activity 中登录和退出 Google
- ios - IOS Instagram登录
- php - 避免使用 PHP 在 csv 中插入重复数据
- css - 用于图像布局问题的 CSS
- c# - 如何使用自定义比较器在 C# 中按字母顺序对元素进行排序
- go - 无法将 privateKey 类型 pem.Block 转换为字符串类型
- python - 如何过滤没有标题的熊猫数据框
- php - 传递用户名和密码时如何区分要在两个表之间读取的数据?