【问题标题】:What does "Incompatible types: void cannot be converted to ..." mean?“不兼容的类型:void 不能转换为 ...”是什么意思?
【发布时间】:2017-07-11 04:37:23
【问题描述】:

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 中可能遇到的问题。)

【问题讨论】:

    标签: java compiler-errors type-conversion void


    【解决方案1】:

    快速解答

    编译器告诉您,您的代码正在尝试使用不返回结果的方法的“结果”。

    解决方案:

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

    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 方法中指定行的指定位置存在问题。问题的根本原因不一定在该行,但编译器发现 something 是错误的。

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

    • 不兼容涉及两种类型: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 调用返回一个int 值,我们将分配给sum

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


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

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

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

      add(1, 1);
      

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

    【讨论】:

      猜你喜欢
      • 2011-10-14
      • 2015-04-28
      • 1970-01-01
      • 2016-08-23
      • 1970-01-01
      • 2018-09-11
      • 2018-04-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多