什么是“错误:不兼容的类型: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
方法中指示的行上的指示位置检测到问题。 问题的根本原因不一定在那条线上,但这就是编译器已经发现问题出错的地方。 -
这是一个类型错误 – 因此是“不兼容的类型”短语。
- 不兼容性涉及两种类型:
void
和int
。 - 编译器认为代码需要从
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
调用返回一个我们将赋给sum
的int
值。
这就是“无法分配给…的空白”错误消息的真正含义。 编译器告诉我们代码正在尝试使用已声明不返回结果的方法的结果。 那是不可能的。 Java语言不允许您“使用空中值”来使用。
有两种方法可以使编译错误消失:
-
我们可以更改方法的声明,以便它返回一个值。 例如:
private static int add(int a, int b) { int res = a + b; return res; }
-
我们可以更改调用站点,以便它不会尝试使用(不存在的)返回值。 例如:
add(1, 1);
在这个例子中,任何一种方法都可以做到。 但只有一种方法(第一种方法)使代码按预期工作。