"Incompatible types: void cannot be converted to ..." 是什么意思?
What does "Incompatible types: void cannot be converted to ..." mean?
Java编译信息是什么:
"Incompatible types: void cannot be converted to ..."
意思是,我该如何解决。一些编译器使用不同的措辞;例如
"Type mismatch: cannot convert from void to ..."
或
"Incompatible types. Required: ... found: void"
或
"Incompatible types: Found void, required ..."
(这旨在成为一些非常具体的编译错误消息的规范问答,涉及“void”,这些错误消息往往会使新 Java 程序员感到困惑。它不是教程关于 Java 中可能遇到的各种不同的“类型转换”问题。)
快速回答
编译器告诉您,您的代码正在尝试使用没有 return 结果的方法的“结果”。
解法:
阅读您尝试调用的方法的 javadoc(如果您没有 javadoc,则阅读源代码)。
从 javadoc(或源代码)中找出该方法应该如何使用。
将您的代码更正为 不 使用 (non-existent) 结果,或者使用不同的方法。或者,如果它是您正在调用的方法之一,另一种可能的更正可能是将该方法更改为 return 适当的值。
详细示例
考虑这个例子:
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
方法,以及 return 和 void
。这意味着该方法将 return 什么都没有。
然而...我们这样称呼它:
int sum = add(1, 1);
这需要 add
调用 return 我们将分配给 sum
的 int
值。
这就是 “void cannot be assigned to ...” 错误消息 really 的意思。编译器告诉我们代码正在尝试使用已声明为 return 无结果的方法的结果。那是不可能的。 Java 语言不允许您“从空中提取一个值”来使用。
可能有两种方法可以消除编译错误:
我们可以更改该方法的声明,使其执行 return 一个值。例如:
private static int add(int a, int b) {
int res = a + b;
return res;
}
我们可以更改调用站点,这样它就不会尝试使用 (non-existent) return 值。例如:
add(1, 1);
在此示例中,任何一种方法都可以做到这一点。但只有一种方法(第一种)使代码按预期工作。
Java编译信息是什么:
"Incompatible types: void cannot be converted to ..."
意思是,我该如何解决。一些编译器使用不同的措辞;例如
"Type mismatch: cannot convert from void to ..."
或
"Incompatible types. Required: ... found: void"
或
"Incompatible types: Found void, required ..."
(这旨在成为一些非常具体的编译错误消息的规范问答,涉及“void”,这些错误消息往往会使新 Java 程序员感到困惑。它不是教程关于 Java 中可能遇到的各种不同的“类型转换”问题。)
快速回答
编译器告诉您,您的代码正在尝试使用没有 return 结果的方法的“结果”。
解法:
阅读您尝试调用的方法的 javadoc(如果您没有 javadoc,则阅读源代码)。
从 javadoc(或源代码)中找出该方法应该如何使用。
将您的代码更正为 不 使用 (non-existent) 结果,或者使用不同的方法。或者,如果它是您正在调用的方法之一,另一种可能的更正可能是将该方法更改为 return 适当的值。
详细示例
考虑这个例子:
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
方法,以及 return 和 void
。这意味着该方法将 return 什么都没有。
然而...我们这样称呼它:
int sum = add(1, 1);
这需要 add
调用 return 我们将分配给 sum
的 int
值。
这就是 “void cannot be assigned to ...” 错误消息 really 的意思。编译器告诉我们代码正在尝试使用已声明为 return 无结果的方法的结果。那是不可能的。 Java 语言不允许您“从空中提取一个值”来使用。
可能有两种方法可以消除编译错误:
我们可以更改该方法的声明,使其执行 return 一个值。例如:
private static int add(int a, int b) { int res = a + b; return res; }
我们可以更改调用站点,这样它就不会尝试使用 (non-existent) return 值。例如:
add(1, 1);
在此示例中,任何一种方法都可以做到这一点。但只有一种方法(第一种)使代码按预期工作。