为什么Java16 records不再支持C-style数组写法,Java15却可正常编译?
问题原因解答
1. Java 15 可编译不是实现bug
records特性在Java 14、15版本中处于预览阶段,功能规范和实现都还在迭代调整,并未最终定稿。当时的预览版实现还没有加入对C风格数组声明的限制,属于特性成熟前的正常阶段,并非bug。
直到Java 16 records正式转正,相关语法限制才最终确定落地,所以升级到Java 16后会出现编译报错。
2. 仅records禁用C风格数组写法的原因
- C风格的
int bar[]数组声明本身是Java为了兼容C/C++开发者习惯保留的历史遗留语法,Java官方从诞生起就更推荐将数组标记放在类型侧的写法int[] bar,表意更清晰,不容易产生歧义。 - 普通方法参数、变量声明等场景允许遗留写法,是为了兼容从Java 1.0开始积累的海量老代码,无法贸然砍掉该语法。
- 而records是Java 16才首次正式推出的全新语法特性,没有历史兼容包袱。设计团队在规范定稿时明确要求record组件的类型声明必须统一格式,禁止使用容易产生歧义的遗留数组写法,目的是强制开发者使用更清晰规范的类型声明方式,从根源上避免类似
int a, b[]这种容易混淆变量类型的写法出现。
解决方案
把数组标记移到类型侧即可正常编译:
record Foo(int[] bar) {}
内容的提问来源于stack exchange,提问作者Zabuzard
相关产品推荐
相关产品推荐

