什么"不兼容的类型:void无法转换为..."意思?

时间:2017-02-21 13:56:10

标签: java compiler-errors type-conversion void

Java编译消息是什么:

_DEBUG

意思是,我该如何修复它。有些编译器使用不同的措辞; e.g。

"Incompatible types: void cannot be converted to ..." 

(这是一个规范的Q& A,用于非常具体的编译错误消息,涉及" void"这会混淆新的Java程序员。它不打算成为各种不同的教程&# 34;类型转换" Java中可能遇到的问题。)

1 个答案:

答案 0 :(得分:5)

快速回答

编译器告诉您正在尝试使用"结果"一种没有返回结果的方法。

<强>解决方案:

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

  2. 从javadocs /源代码中了解该方法的使用方法。

  3. 将代码更正为使用(不存在的)结果,或使用其他方法。或者,更改要调用的方法以返回值。

  4. 详细示例

    考虑这个例子:

    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方法的指示行上的指示位置检测到问题。问题的根本原因不一定就在那条线上,但这就是编译器已经发现某些东西错误的地方。

    • 这是一种类型错误 - 因此&#34;不兼容的类型&#34;短语。

    • 不兼容性涉及两种类型:voidint
    • 编译器认为代码需要从void转换为int ......这是不可能的。

    那么这个void类型是什么?

    那么,您很可能已经了解到Java支持两种类型:基本类型和引用类型。 void类型不是这些中的任何一个。这是&#34;类型&#34;这意味着&#34;没有价值&#34;。 (如果您将类型视为值集,则void为空集。)

    void类型的主要用途是在方法声明中。查看上面add方法的声明。请注意,我们已使用签名声明add

    private static void add(int a, int b)
    

    该签名表明add方法需要两个int方法,并返回void。这意味着该方法不会返回任何内容。

    然而......我们这样称呼它:

    int sum = add(1, 1);
    

    预计add调用会返回int值,我们将分配给sum

    这是&#34; void无法分配给...&#34; 错误消息真正的意思。编译器告诉我们代码正在尝试使用已声明不返回结果的方法的结果。这是不可能的。 Java语言不允许你从空中汲取价值。使用。

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

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

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

      add(1, 1);
      
    3. 在这个例子中,任何一种方法都可以。但只有一种方法(第一种方法)使代码按预期工作