什么是“错误:不兼容的类型:void无法转换为……”是什么意思?

Java编译消息是什么:

"Error: Incompatible types: void cannot be converted to ..." 

意思是,我该如何解决它。

(这是针对涉及“void”的非常具体的编译错误消息的规范性问答,这会使新的Java程序员感到困惑。它不是一本关于Java中可能遇到的各种“类型转换”问题的教程。 )

考虑这个例子:

 public class Test { private static void add(int a, int b) { int res = a + b; } public static void main(String[] args) { int sum = add(1, 1); } } 

当我使用javac (Java 8)编译它时,我得到以下编译错误。

 $ javac Test.java Test.java:7: error: incompatible types: void cannot be converted to int int sum = add(1, 1); ^ 1 error 

编译错误实际上告诉我们一些事情:

  • 编译器在main方法中指示的行上的指示位置检测到问题。 问题的根本原因不一定在那条线上,但这就是编译器已经发现问题出错的地方。

  • 这是一个类型错误 – 因此是“不兼容的类型”短语。

  • 不兼容性涉及两种类型: voidint
  • 编译器认为代码需要从void转换为int …而这是不可能的。

那么这个void类型是什么? 好吧,您很可能已经了解到Java支持两种类型:基本类型和引用类型。 void类型不是这些中的任何一种 。 它是“类型”,意思是“没有价值”。 (如果将类型视为值集,则void为空集。)

void类型的主要用途是在方法声明中使用。 查看上面add方法的声明。 请注意,我们已使用签名声明add

 private static void add(int a, int b) 

该签名声明add方法采用两个int方法,并返回void 。 这意味着该方法将不返回任何内容。

然而……我们称之为:

 int sum = add(1, 1); 

这期望add调用返回一个我们将赋给sumint值。

这就是“无法分配给…的空白”错误消息的真正含义。 编译器告诉我们代码正在尝试使用已声明不返回结果的方法的结果。 那是不可能的。 Java语言不允许您“使用空中值”来使用。


有两种方法可以使编译错误消失:

  1. 我们可以更改方法的声明,以便它返回一个值。 例如:

     private static int add(int a, int b) { int res = a + b; return res; } 
  2. 我们可以更改调用站点,以便它不会尝试使用(不存在的)返回值。 例如:

     add(1, 1); 

在这个例子中,任何一种方法都可以做到。 但只有一种方法(第一种方法)使代码按预期工作。