Java编译消息是什么:
"Incompatible types: void cannot be converted to ..."
的意思,以及如何解决。一些编译器使用不同的措词;例如
"Type mismatch: cannot convert from void to ..."
要么
"Incompatible types. Required: ... Found: void
(这旨在对涉及“ void”的非常具体的编译错误消息进行规范的问答,该错误消息会使新的Java程序员感到困惑。它的目的并非是关于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
$ javac Test.java Test.java:7: error: incompatible types: void cannot be converted to int int sum = add(1, 1); ^ 1 error
编译错误实际上是在告诉我们一些事情:
那是什么void类型呢?
好吧,你很可能已经了解到Java支持两种类型:基本类型和引用类型。该void类型的这些也不。“类型”意味着“没有价值”。(如果你将类型视为值的集合,void则为空集合。)
void
该void类型的主要用途是在方法声明中。查看add上面方法的声明。注意,我们已经声明add了签名:
add
private static void add(int a, int b)
该签名表明该add方法采用两个int方法,然后返回void。这意味着该方法将不返回任何内容。
但是…我们这样称呼它:
int sum = add(1, 1);
期望该add调用返回一个int我们将分配给的值sum。
这就是“ void无法分配给…”错误消息的真正含义。编译器告诉我们代码正在尝试使用已声明为不返回任何结果的方法的结果。那不可能 Java语言不允许你“空想”地使用值。
可能有两种方法可以使编译错误消失:
我们可以更改方法的声明,以便它确实返回一个值。例如:
private static int add(int a, int b) { int res = a + b; return res; }
我们可以更改呼叫站点,以便它不会尝试使用(不存在的)返回值。例如:
add(1, 1);
在此示例中,两种方法都可以做到这一点。但是只有一种方法(第一种方法)可使代码按预期工作。