Cuál es la diferencia entre java.lang.¿Vacío y vacío?


En API

" La clase Void es una clase de marcador de posición insustanciable para contener una referencia al objeto de clase que representa la palabra clave Java void."

  1. ¿Qué es la clase "insustanciable"? ¿Cuándo se utilizará java.lang.Void? Si la clase es "insustanciable", ¿de qué sirve?
  2. ¿Cuál es la diferencia entre java.lang.Void y void?
 52
Author: Radu Murzea, 2012-05-31

6 answers

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

Usted no puede, y no debe, usarlo para otra cosa.

 45
Author: Louis Wasserman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-05-31 18:19:53

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

" Pero espera, void no tiene ningún valor posible!"

Derecho! Eso es lo que hace que java.lang.Void sea "insustanciable". :)

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

"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 valores posibles; 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 programas."

Y no tengo ningún uso para GarbageCollectorMXBean en mina. Algunas características no tienen usos no oscuros. Está bien.

 86
Author: Quuxplusone,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-09-27 22:00:48

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 resulta en un valor.

java.lang.Void es un tipo de referencia, entonces lo siguiente es válido:

 Void nil = null;

(hasta ahora no es interesante...)

Como resultado type (una función con un valor devuelto de tipo Void) significa que la función * siempre * devuelve null (no puede devolver nada más que 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 null?

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

Con los genéricos, hay algunos casos interesantes. Por ejemplo, un Future<T> es un soporte para el resultado de una operación asíncrona realizada por otro hilo. Future.get devolverá el valor de operación (de tipo T), y bloqueará hasta el cálculo se realiza.

Pero... ¿Y si no hay nada que devolver? Simple: use un Future<Void>. Por ejemplo, en Google App Engine el Servicio de Almacén de Datos Asíncrono delete la operación devuelve un futuro . Whenget () is invoked on that future,null` se devuelve después de que se complete la eliminación. Uno podría escribir un ejemplo similar con Callable s.

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

 44
Author: Javier,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-02-23 13:43:35

Void es una función de AutoBoxing (desde JDK 1.5) de void.

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

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

Un uso común con tipos Genéricos donde no podemos usar primitivo.

Digamos, en el caso de Android AsyncTaks<Params, Progress, Result> no desea obtener la actualización de progreso. No puedo usar void (tipo primitivo) aquí requerimos java.lang.Void

 4
Author: Amit Yadav,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-10-19 16:05:40

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

Por ejemplo, tomemos esta expresión java 8 lambda, que comprueba si un objeto EventResource tiene ciertas propiedades, utilizando 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<EventResource, Void> describes the checkBenefitConcertInCentralPark method
    public void checkCreatedEvent(Function<EventResource, Void> function) { 
        function.apply(this.eventResource);
    }
 1
Author: John Deverall,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-05-23 11:03:02

Otro ejemplo para usar Void es SwingWorker

new SwingWorker<Void, Integer> () {
    @Override
    protected Void doInBackground(){
        ...
    }
    @Override
    protected void process(List<Integer> chunk){
        ...
    }
    @Override
    public void done(){
        ...
    }
}.execute();
 1
Author: Maxwell Cheng,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-07-02 21:32:05