"Incompatible types: void cannot be converted to ..."是什么意思?



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 ..."

(这是针对某些非常具体的汇编错误消息的规范Q& a涉及" void"倾向于混淆新的Java程序员。它并不是打算对各种不同的教程进行教程;键入"在Java中可以遇到的问题"。)

快速答案

编译器告诉您您的代码正在尝试使用"结果"。一个不返回结果的方法。

解决方案:

  1. 阅读您要调用的方法(如果没有Javadocs)的Javadoc。

  2. 来自Javadocs(或源代码),确定应如何真正使用该方法。

  3. 更正您的代码不是使用(不存在的)结果,或使用其他方法。另外,如果这是您正在调用的方法之一,则另一种可能的更正可能是更改返回适当值的方法。

详细的示例

考虑此示例:

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值。

这是'void不能分配给... 错误消息真正的含义。编译器告诉我们,代码正在尝试使用已声明的方法的结果,该方法已被声明返回不返回结果。那是不可能的。Java语言不允许您"从空中提取价值"。使用。


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

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

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

    add(1, 1);
    

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

工作

相关内容

最新更新