Java 10局部变量类型推断能否推断void?为何var接收void返回方法可编译?
为什么用
var接收返回值为void的方法调用能通过编译? 这个问题我刚接触Java 10的局部变量类型推断时也好奇过,当时还特意翻了下语言规范,现在给你捋清楚:
先回顾下场景:
- Java 10之前的常规写法:
String s1 = "hello"; - Java 10及之后用
var的简化写法:var s2 = "hello";
而关于void方法的调用,之前直接声明void类型变量赋值会直接编译失败:
void emptyMethod() { } // 编译报错:void不能作为变量类型 void v1 = emptyMethod();
但换成var就完全没问题:
var v2 = emptyMethod(); // 编译通过
核心原因:编译器对var+void方法调用的特殊处理
Java语言规范里专门针对这种情况做了规定:当var声明的变量右边是返回值为void的方法调用表达式时,编译器不会尝试去推断一个具体的类型(毕竟void不是一个可实例化的类型),而是把整个语句当作一个普通的方法调用语句来看待——就像你直接写emptyMethod();不加赋值一样。
换句话说,var v2 = emptyMethod();本质上和直接调用emptyMethod();的语义是一致的,var在这里只是一个语法上的占位,编译器允许你这么写,但实际上这个v2变量是没有有效类型的:你没法对它做任何操作,比如尝试打印v2、把它赋值给其他变量,编译器都会直接报错,因为它的“类型”是void,根本不具备可操作的属性。
举个反例验证
如果你试着对这个变量做操作:
var v2 = emptyMethod(); System.out.println(v2); // 编译报错:void类型无法被打印
这就能看出来,var只是允许你写这个赋值语句,但这个变量实际上是“无用”的,没法进行任何实际的使用。
内容的提问来源于stack exchange,提问作者mrek
相关产品推荐
相关产品推荐

