"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 结果的方法的“结果”。

解法:

  1. 阅读您尝试调用的方法的 javadoc(如果您没有 javadoc,则阅读源代码)。

  2. 从 javadoc(或源代码)中找出该方法应该如何使用。

  3. 将您的代码更正为 使用 (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 方法中指定行的指定位置存在问题。问题的根本原因不一定在那一行,而是编译器发现 某些地方 错误的地方。

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

  • 不兼容包括两种类型:voidint

  • 编译器认为代码需要从voidint的转换……这是不可能的。


那么这个 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 我们将分配给 sumint 值。

这就是 “void cannot be assigned to ...” 错误消息 really 的意思。编译器告诉我们代码正在尝试使用已声明为 return 无结果的方法的结果。那是不可能的。 Java 语言不允许您“从空中提取一个值”来使用。


可能有两种方法可以消除编译错误:

  1. 我们可以更改该方法的声明,使其执行 return 一个值。例如:

    private static int add(int a, int b) {
        int res = a + b;
        return res;
    }
    
  2. 我们可以更改调用站点,这样它就不会尝试使用 (non-existent) return 值。例如:

    add(1, 1);
    

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