允许new int[] {0}[0] = 1;正常编译的Java语法规则是什么?
你对JLS语法规则的理解存在偏差,问题出在你只孤立查看了ArrayAccess的单条语法定义,没有结合Java表达式体系的递归规则来看:
Java的表达式语法有明确的层级递归关系:
- 数组创建表达式
new int[] {0}属于首要表达式(Primary) - 首要表达式属于后缀表达式(PostfixExpression)
- 后缀表达式的语法规则明确允许:任意合法的后缀表达式后,跟上用方括号包裹的下标表达式,整体构成合法的数组访问表达式
对应到你的示例代码中,new int[] {0}本身是合法的后缀表达式,后续追加[0]完全符合后缀表达式的语法要求,最终得到的new int[] {0}[0]是合法的数组访问结果,属于可被赋值的左值,因此整个赋值表达式可以正常编译。
你提到的ArrayAccess语法定义里的「前半部分只能是表达式名或PrimaryNoNewArray」,是数组访问的基础无递归的最简形式,完整的语法体系通过后缀表达式的递归规则,已经覆盖了数组创建表达式作为数组访问左部的场景,不属于规范疏漏。
内容的提问来源于stack exchange,提问作者Geoff
相关产品推荐
相关产品推荐

