什么是“错误:不兼容的类型:void无法转换为...”意思? [英] What does "Error: Incompatible types: void cannot be converted to ..." mean?

查看:2736
本文介绍了什么是“错误:不兼容的类型:void无法转换为...”意思?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

Java编译消息是什么:

What does the Java compilation message:

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

是什么意思,我该怎么办呢。

mean, and how do I fix it.

(这是一个规范的Q& A,用于涉及void的非常具体的编译错误消息,这会使新的Java程序员感到困惑。它不是一个关于各种不同的类型转换问题的教程。在Java中遇到。)

(This is intended to be a canonical Q&A for a very specific compilation error message involving "void" that confuses new Java programmers. It is not intended to be a tutorial on the various different "type conversion" problems that one can encounter in Java.)

推荐答案

考虑这个例子:

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),我得到以下编译错误。

When I compile this using javac (Java 8), I get the following compilation error.

$ javac Test.java 
Test.java:7: error: incompatible types: void cannot be converted to int
        int sum = add(1, 1);
                     ^
1 error

编译错误实际上是在告诉我们一些事情:

The compilation error is actually telling us a few things:


  • 编译器检测到在<指示行的指示位置发现问题code> main 方法。问题的根本原因不一定就在那条线上,但这就是编译器已经发现某事错误的地方。

  • The compiler has detected a problem at the indicated position on the indicated line in the main method. The root cause of the problem is not necessarily on that line, but that is where the compiler has figured out that something is wrong.

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

It is a type error - hence the "incompatible types" phrase.

那么这个 void 类型是什么?好吧,您很可能已经了解到Java支持两种类型:基本类型和引用类型。 void 类型不是这些。它是类型,意思是没有价值。 (如果您认为类型是值集,那么 void 是空集。)

So what is this void type? Well, you will most likely have learned that Java supports two kinds of type: primitive types and reference types. The void type is not either of these. It is the "type" that means "there is no value". (If you consider types to be sets of values, then void is the empty set.)

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

The primary use for the void type is used is in method declarations. Look at the declaration of the add method above. Notice that we have declared add with the signature:

private static void add(int a, int b)

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

That signature states that the add method takes two int methods, and returns void. That means that the method will return nothing.

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

Yet ... we have called it like this:

int sum = add(1, 1);

这是期待添加的回复我们将分配给 sum int 值。

This is expecting the add call to return an int value that we will assign to sum.

这就是void无法分配给...错误消息真正的意思。编译器告诉我们代码正在尝试使用已声明不返回结果的方法的结果。那是不可能的。 Java语言不允许你从空中拉出一个值来使用。

This is what the "void cannot be assigned to ..." error message really means. The compiler is telling us that code is trying to use the result of a method that has been declared to return no result. That's not possible. The Java language does not allow you to "pull a value out of the air" to use.

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

There are potentially two ways to make the compilation error go away:


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

  1. We could change the declaration of the method so that it does return a value. For example:

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


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

  • We could change the call site so that it does not attempt yo use the (non-existent) return value. For example:

    add(1, 1);
    


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

    In this example, either approach would do that. But only one approach (the first one) makes the code work as intended.

    这篇关于什么是“错误:不兼容的类型:void无法转换为...”意思?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

    查看全文
    相关文章
    登录 关闭
    扫码关注1秒登录
    发送“验证码”获取 | 15天全站免登陆