You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 12:22:59