¿Qué significa “Error: tipos incompatibles: el vacío no se puede convertir a …” significa?

¿Qué significa el mensaje de comstackción de Java?

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

significa, y cómo lo soluciono

(Esto pretende ser una Q & A canónica para un mensaje de error de comstackción muy específico que involucra “vacío” que confunde a los nuevos progtwigdores de Java. No pretende ser un tutorial sobre los diferentes problemas de “conversión de tipo” que uno puede encontrar en Java. )

Considera este ejemplo:

 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); } } 

Cuando compilo esto usando javac (Java 8), obtengo el siguiente error de comstackción.

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

El error de comstackción en realidad nos dice algunas cosas:

  • El comstackdor ha detectado un problema en la posición indicada en la línea indicada en el método main . La causa raíz del problema no está necesariamente en esa línea, pero es allí donde el comstackdor ha descubierto que algo anda mal.

  • Es un tipo de error, de ahí la frase “tipos incompatibles”.

  • La incompatibilidad involucra dos tipos: void e int .
  • El comstackdor cree que el código requiere una conversión de void a int … y eso no es posible.

Entonces, ¿qué es este tipo de void ? Bueno, es muy probable que haya aprendido que Java admite dos tipos de tipos: tipos primitivos y tipos de referencia. El tipo de void no es ninguno de estos . Es el “tipo” que significa “no hay valor”. (Si considera que los tipos son conjuntos de valores, entonces el void es el conjunto vacío).

El uso principal para el tipo de void se utiliza en las declaraciones de métodos. Mira la statement del método add arriba. Observe que hemos declarado add con la firma:

 private static void add(int a, int b) 

Esa firma indica que el método add toma dos métodos int y devuelve void . Eso significa que el método no devolverá nada.

Sin embargo … lo hemos llamado así:

 int sum = add(1, 1); 

Esto espera que la llamada int devuelva un valor int que asignaremos a la sum .

Esto es lo que realmente significa el mensaje de error “no se puede asignar a …” . El comstackdor nos dice que el código está tratando de usar el resultado de un método que ha sido declarado para no devolver ningún resultado. Eso no es posible. El lenguaje Java no le permite “extraer un valor del air” para usar.


Hay dos formas posibles de que desaparezca el error de comstackción:

  1. Podríamos cambiar la statement del método para que devuelva un valor. Por ejemplo:

     private static int add(int a, int b) { int res = a + b; return res; } 
  2. Podríamos cambiar el sitio de llamada para que no intente usar el valor de retorno (inexistente). Por ejemplo:

     add(1, 1); 

En este ejemplo, cualquiera de los enfoques haría eso. Pero solo un enfoque (el primero) hace que el código funcione según lo previsto .