局部变量的Java10类型推断是否可以推断为void?

局部变量的Java10类型推断是否可以推断为void?,java,type-inference,java-10,Java,Type Inference,Java 10,使用Java10,我们可以使用类型推断 String s1 = "hello"; // before Java 10 var s2 = "hello"; // now 但是,有一件事我们以前不能做:使用类型为void的变量 因此,在以前的版本中,我们无法定义变量类型void。但现在我们可以将返回void方法的结果分配给变量: void emptyMethod() { } ... void v1 = emptyMethod(); // won't compile var v2 = emptyM

使用Java10,我们可以使用类型推断

String s1 = "hello"; // before Java 10
var s2 = "hello"; // now
但是,有一件事我们以前不能做:使用类型为void的变量

因此,在以前的版本中,我们无法定义变量类型
void
。但现在我们可以将返回
void
方法的结果分配给变量:

void emptyMethod() { }
...

void v1 = emptyMethod(); // won't compile
var v2 = emptyMethod(); // no problem at all
问题是——它为什么要编译,它有什么用途?你有这个奇怪的东西的使用案例吗


void
类型的变量没有方法,它甚至不能用作方法的参数。

为什么您认为它可以编译?它不编译:

> javac Main.java
Main.java:5: error: cannot infer type for local variable v2
        var v2 = emptyMethod(); // no problem at all
            ^
  (variable initializer is 'void')
1 error

你可能会使用IntelliJ IDEA,是吗?IDEA目前没有检测到此类错误。这其中有一个bug:

@berry120因为
private
Void
构造函数不会抛出任何东西(在《有效Java》一书中建议使用
断言错误),所以可以使用反射创建
Void
的实例。@Martin就在我停止对此类评论进行“反射hacks”的时候,必须有人介入并再次表明需要它!这显示了eclipse方法的优势,他们利用自己的java编译器在IDE中生成错误,因此它总是与实际的编译器结果一致。