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."
- ¿Qué es la clase "insustanciable"? ¿Cuándo se utilizará
java.lang.Void
? Si la clase es "insustanciable", ¿de qué sirve? - ¿Cuál es la diferencia entre
java.lang.Void
yvoid
?
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.
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.
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 . When
get () 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>
).
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
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);
}
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();
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