C 样式数组不再适用于记录

2022-09-02 01:21:39

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

record Foo(int bar[]) {}

它利用了C风格的数组表示法。它在Java 15中编译得很好。

现在,突然之间,随着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(基于OpenJDK)。javac


答案 1

解释

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

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


错误

它在Java 15中工作的事实确实是一个错误。规范实际上不允许它,即使对于Java 15也是如此,但这被忽视并意外地支持它。javac

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

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


JLS 定义

JLS中不允许使用表示法的部分可以在JLS §8.10.1中找到,其中它将s的语法定义为:RecordComponent

RecordComponent:
  {RecordComponentModifier} UnannType Identifier
  VariableArityRecordComponent 

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

RecordComponentModifier:
  Annotation

答案 2