Что означает "Несовместимые типы: 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
Быстрый ответ
Компилятор сообщает вам, что ваш код пытается использовать "результат" метода, который не возвращает результат.
Решение:
Прочитайте javadoc для метода, который вы пытаетесь вызвать (или исходный код, если у вас нет javadocs).
Исходя из javadocs (или исходного кода), определите, как на самом деле следует использовать метод.
Исправьте свой код, чтобы либо не использовать (несуществующий) результат, либо использовать другой метод. Альтернативно, если вы вызываете один из ваших методов, другим возможным исправлением может быть изменение метода, чтобы он возвращал соответствующее значение.
Подробный пример
Рассмотрим этот пример:
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 не позволяет вам "извлекать значение из воздуха" для использования.
Потенциально есть два способа устранить ошибку компиляции:
Мы могли бы изменить объявление метода, чтобы он возвращал значение. Например:
private static int add(int a, int b) {
int res = a + b;
return res;
}Мы могли бы изменить сайт вызова, чтобы он не пытался использовать (несуществующее) возвращаемое значение. Например:
add(1, 1);
В этом примере это можно сделать с помощью любого подхода. Но только один подход (первый) заставляет код работать так, как задумано.