C 样式数组不再与记录一起使用

C-style arrays do not work with records anymore

我以前使用过这个人为设计的代码

record Foo(int bar[]) {}

它正在使用 C 风格的数组-表示法。它在 Java 15.

中编译得很好

现在,突然之间,records 在 Java 16 中的正式发布,它不再编译了。这是 jshell:

的输出
jshell> record Foo(int bar[]) {}
|  Error:
|  legacy array notation not allowed on record components
|  record Foo(int bar[]) {}
|                    ^

为什么在Java 15 中编译,这是一个错误吗?出于好奇,为什么它在记录中不受支持,而在 Java 中的其他任何地方都受支持?

我正在使用 Adoptium 中的 javac(基于 OpenJDK)。

说明

C 风格的数组表示法被认为是 遗留的 并且他们似乎正试图在可能的情况下在新结构上淡出它(它不能在旧结构上进行改造不降低向后兼容性)。

您必须向真正的开发人员询问此决定背后的确切原因。


错误

它在 Java 15 中起作用的事实 确实是一个错误。规格实际上不允许它,即使是 Java 15,但这被忽略了并且 javac 不小心支持了它。

他们注意到它并为 Java 16 修复了它,因此它不再编译。

您可以在此处阅读更多相关信息:


JLS 定义

JLS 中不允许表示法的部分可以在 JLS §8.10.1 找到,其中定义 RecordComponents 的语法为:

RecordComponent:
  {RecordComponentModifier} UnannType Identifier
  VariableArityRecordComponent 

VariableArityRecordComponent:
  {RecordComponentModifier} UnannType {Annotation} ... Identifier

RecordComponentModifier:
  Annotation