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 修复了它,因此它不再编译。
您可以在此处阅读更多相关信息:
- 错误报告:JDK-8250629
- 修复它的任务:JDK-8260739
- 实际提交:rev/059df93c90a4
JLS 定义
JLS 中不允许表示法的部分可以在 JLS §8.10.1 找到,其中定义 RecordComponent
s 的语法为:
RecordComponent:
{RecordComponentModifier} UnannType Identifier
VariableArityRecordComponent
和
VariableArityRecordComponent:
{RecordComponentModifier} UnannType {Annotation} ... Identifier
和
RecordComponentModifier:
Annotation
我以前使用过这个人为设计的代码
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 修复了它,因此它不再编译。
您可以在此处阅读更多相关信息:
- 错误报告:JDK-8250629
- 修复它的任务:JDK-8260739
- 实际提交:rev/059df93c90a4
JLS 定义
JLS 中不允许表示法的部分可以在 JLS §8.10.1 找到,其中定义 RecordComponent
s 的语法为:
RecordComponent:
{RecordComponentModifier} UnannType Identifier
VariableArityRecordComponent
和
VariableArityRecordComponent:
{RecordComponentModifier} UnannType {Annotation} ... Identifier
和
RecordComponentModifier:
Annotation