Вопрос-ответ

What does "Incompatible types: void cannot be converted to ..." mean?

Что означает "Несовместимые типы: void не может быть преобразован в ..."?

Что означает сообщение о компиляции 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.)

Переведено автоматически
Ответ 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 методе. Основная причина проблемы не обязательно находится в этой строке, но именно там компилятор обнаружил, что что-то не так.



  • Это ошибка типа - отсюда фраза "несовместимые типы".



  • Несовместимость включает в себя два типа: 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 не может быть присвоен ...". Компилятор сообщает нам, что код пытается использовать результат метода, который был объявлен для возврата no result . Это невозможно. Язык Java не позволяет вам "извлекать значение из воздуха" для использования.


Потенциально есть два способа устранить ошибку компиляции:


  1. Мы могли бы изменить объявление метода, чтобы он возвращал значение. Например:


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


  2. Мы могли бы изменить сайт вызова, чтобы он не пытался использовать (несуществующее) возвращаемое значение. Например:


    add(1, 1);


В этом примере это можно сделать с помощью любого подхода. Но только один подход (первый) заставляет код работать так, как задумано.

java