当前位置: 首页 > 面试题库 >

Java“不兼容的类型:void无法转换为...”是什么意思?

苏彦君
2023-03-14
问题内容

Java编译消息是什么:

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

的意思,以及如何解决。一些编译器使用不同的措词;例如

"Type mismatch: cannot convert from void to ..."

要么

"Incompatible types. Required: ... Found: void 

(这旨在对涉及“ void”的非常具体的编译错误消息进行规范的问答,该错误消息会使新的Java程序员感到困惑。它的目的并非是关于Java中可能遇到的各种不同的“类型转换”问题的教程。 )

java 编译器错误 类型转换 无效


问题答案:

快速回答

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

解:

  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。问题的根本原因不一定在该行,但毕竟是在编译器已经想通了,什么是错的。
  • 这是类型错误-因此是“不兼容的类型”短语。
  • 不兼容涉及两种类型:void和int。
  • 编译器认为代码需要从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无法分配给…”错误消息的真正含义。编译器告诉我们代码正在尝试使用已声明为不返回任何结果的方法的结果。那不可能 Java语言不允许你“空想”地使用值。

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

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

private static int add(int a, int b) {
    int res = a + b;
    return res;
}

我们可以更改呼叫站点,以便它不会尝试使用(不存在的)返回值。例如:

add(1, 1);

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



 类似资料:
  • 问题内容: 一般来说,对于Java和编程,我是一个新手。我正在尝试创建一个简单的程序,您可以在其中猜测我的年龄,如果您是对的,它将说“正确”,如果您错了,它将说“错”。 这是我的代码: 我收到错误消息“不兼容的类型:void无法转换为int”,但代码中没有void类?我知道我的代码可能很糟糕,但是如果你们能为我指出正确的方向,那就太好了。谢谢。 问题答案: 您的程序不必返回in 。相反,您可以将其

  • 我收到一个错误,指出ArrayList不能在我的上转换为int 我正在编写一个程序,在这个程序中,我必须从一个文件中读取所有整数,并计算它们的总和。我还处理所有异常,因此如果抛出异常,函数应该返回0。 这是我的代码: 下面是我的单元测试,读取文件后应该通过: 感谢您的帮助。 谢谢!

  • 我试图通过在一个单独的线程上进行工作并返回所需的对象来更改JavaFX中的GUI。然而,在完成工作和任务之后。setOnSucceeded()在尝试检索创建的对象时被触发,并出现错误“不兼容类型:对象无法转换为VideoScrollPane类型”。 我认为这与原始类型有关,因为这是在听众中发生的,但环顾四周后,我找不到我想要的建议。 任何可以散发的光芒都将不胜感激。

  • java: 不兼容的类型: java.util.ArrayList<java.lang.Object>无法转换为java.util.List<springfox.documentation.service.Response> 这是为什么呢 代码如下 package com.gxa.medical.swagger; import org.springframework.http.HttpMethod

  • 问题内容: 我试图通过在单独的线程上进行工作并返回所需的对象来对JavaFX中的GUI进行更改。但是,在完成工作和task.setOnSucceeded()之后,我尝试检索创建的对象并得到错误“不兼容的类型:对象无法转换为VideoScrollPane类型”。 我认为这与原始类型有关,因为它发生在侦听器中,但是四处查看后,我找不到我想要的建议。 任何可以散发出的光将不胜感激。 问题答案: 这是因为

  • 而当运行时,我收到的是: 错误:不兼容类型:int无法转换为客户端ClientDAO.Delete(clientId);