¿Cuál es la diferencia entre java.lang.Void y void?

En API

“La clase Void es una clase de marcador de posición no ejecutable para contener una referencia al objeto Class que representa la palabra clave Java void”.

  1. ¿Qué es una clase de titular de lugar “no ejecutable”? ¿Cuándo se usará java.lang.Void ? Si la clase es “desinstalable”, ¿de qué sirve?
  2. ¿Cuál es la diferencia entre java.lang.Void y void ?

El único punto de Void es mantener Void.TYPE , que es algo así como void.class . Si tiene una referencia reflexiva a un método que devuelve void y obtiene su tipo de devolución, devolverá Void.TYPE .

No puedes, y no debes, usarlo para nada más.

java.lang.Void es análogo a java.lang.Integer . Integer es una forma de boxeo de valores del tipo primitivo int . Void es una forma de valores de boxeo del tipo primitivo void .

“¡Pero espera, el void no tiene ningún valor posible!”

¡Derecha! Eso es lo que hace java.lang.Void “desinstalable”. 🙂

Es una buena característica del sistema de tipo Java que cada tipo primitivo tenga un equivalente en caja. int tiene Integer , long tiene Long , byte tiene Byte … y void tiene Void . Sería extraño y asimétrico si Void no existiera.

“Entonces, ¿cuál es la diferencia entre java.lang.Void y void ?”

Fácil. void es un tipo primitivo. Void es un tipo de referencia que hereda de Object . Son similares en que ninguno de ellos tiene ningún valor posible; pero, sin embargo, son dos tipos muy diferentes, desde el punto de vista del sistema de tipos.

“Pero no tengo ningún uso para Void en mis progtwigs”.

Y no tengo ningún uso para GarbageCollectorMXBean en el mío. Algunas características no tienen usos no oscuros. Esta bien.

El uso más común de Void es para la reflexión, pero ese no es el único lugar donde se puede usar.

void es una palabra clave que significa que una función no genera un valor.

java.lang.Void es un tipo de referencia, luego el siguiente es válido:

  Void nil = null; 

(Hasta ahora no es interesante …)

Como tipo de resultado (una función con un valor de retorno de tipo Void ) significa que la función * siempre * devuelve null (no puede devolver nada que no sea null , porque Void no tiene instancias).

  Void function(int a, int b) { //do something return null; } 

¿Por qué me gustaría una función que siempre devuelve nulo?

Antes de la invención de los generics, no tenía un caso de uso para Void .

Con los generics, hay algunos casos interesantes. Por ejemplo, un Future es un titular para el resultado de una operación asincrónica realizada por otro hilo. Future.get devolverá el valor de operación (de tipo T ) y bloqueará hasta que se realice el cálculo.

Pero … ¿Qué pasa si no hay nada que devolver? Simple: use un Future . Por ejemplo, en Google App Engine, la operación de delete servicio de almacenamiento de datos asincrónico devuelve un futuro . When . When is invoked on that future, get () is invoked on that future, se devuelve null` después de que se completa la eliminación. Uno podría escribir un ejemplo similar con Callable s.

Otro caso de uso es un Map sin valores, es decir, un Map . Tal mapa se comporta como un Set , luego puede ser útil cuando no hay una implementación equivalente de Set (por ejemplo, no hay WeakHashSet , entonces uno podría usar un WeakHashMap ).

Void es una característica de AutoBoxing (desde JDK 1.5) de vacío.

Bueno, se explica por sí mismo que Void es referencia, mientras que el vacío es un tipo primitivo.

Entonces, ¿dónde llega el requisito de tener que usar Void?

Un uso común con tipos generics donde no podemos usar primitivo.

Digamos, en el caso de Android AsyncTaks qué ocurre si no deseo obtener la actualización de Progress. No puedo usar void (tipo primitivo) aquí requerimos java.lang.Void

Void es útil porque a veces necesita especificar el tipo de devolución de un método fuera del método en sí.

Por ejemplo, tome esta expresión java 8 lambda , que verifica si un objeto EventResource tiene ciertas propiedades, usando un método llamado checkBenefitConcertInCentralPark , pasado al método checkCreatedEvent :

 eventChecker.checkCreatedEvent(TestEvents::checkBenefitConcertInCentralPark); 

El método checkBenefitConcertInCentralPark se define así (tenga en cuenta el uso de Void):

  public static Void checkBenefitConcertInCentralPark(EventResource eventResource) { // JUnit code here... // assertThat(blablabla :) ) return null; // we can only return null at the end of a method when returning Void } 

y luego el método checkBenefitConcertInCentralPark se pasa al método checkCreatedEvent .

  // Function describes the checkBenefitConcertInCentralPark method public void checkCreatedEvent(Function function) { function.apply(this.eventResource); } 

Otro ejemplo para usar Void es SwingWorker

 new SwingWorker () { @Override protected Void doInBackground(){ ... } @Override protected void process(List chunk){ ... } @Override public void done(){ ... } }.execute();