Java 9下划线(_)关键字的用途、设为关键字的原因及前景
Java 9中下划线
_关键字的来龙去脉 嘿,这个问题问到点子上了——很多人只知道Java 9之后用_当变量名会报错,但其实背后是Java团队为语言演进做的铺垫。咱们一步步说清楚:
一、现在的现状:用_会直接报错
在Java 9及之后的版本里,如果你尝试把_作为标识符(比如变量名、参数名、方法名),编译器会直接抛出错误:
// Java 8及之前合法,Java 9+编译失败 int _ = 10; // 错误提示: 下划线 '_' 是关键字,不能用作标识符
二、为什么要把_设为关键字?
说白了,这是为未来的语言特性预留“语法位置”,核心原因有两个:
- 避免未来的语法冲突:在Java 9之前,
_可以当普通标识符,但很多主流语言(比如Python、Scala、Kotlin)里,_都承担着特殊语义——比如忽略变量、通配符、占位符。Java团队如果未来想引入类似特性,提前把_设为关键字,就能避免现有代码里的_变量和新特性冲突。 - 规范编码习惯:单一下划线作为标识符本身就不清晰,大部分编码规范都不推荐这么用。把它设为关键字,相当于强制开发者放弃这种模糊的命名方式,提升代码可读性。
三、现在或未来的潜在用途
Java 9只是把_标记为关键字,还没赋予具体功能,但从JDK的演进路线和其他语言的实践来看,它大概率会承担这些角色:
- 解构赋值中的忽略变量:比如未来Java支持记录(Record)的解构时,用
_表示不需要的字段:// 假设未来支持解构语法 record Book(String title, String author, int pages) {} Book myBook = new Book("Java核心技术", "Cay Horstmann", 1000); var (title, _, _) = myBook; // 只取书名,忽略作者和页数 - 模式匹配中的通配符:在模式匹配场景下,用
_表示“匹配任意值,不需要绑定到变量”:// 假设未来支持更灵活的模式匹配 if (obj instanceof Integer _) { // 只关心obj是Integer类型,不需要使用这个变量 } - Lambda表达式的忽略参数:如果Lambda有多个参数但只需要用到部分,用
_跳过不需要的参数:// 假设未来支持这种写法 Map<String, Integer> map = new HashMap<>(); map.forEach((key, _) -> System.out.println("Key: " + key));
简单来说,Java 9把_设为关键字,就是给未来的语法升级留好“坑位”,避免到时候改语法时破坏大量现有代码——这是一种前瞻性的设计。
内容的提问来源于stack exchange,提问作者Andrei L




