¿Cuál es el propósito de la Lista?


Ni siquiera sabía que esto era factible, pero vi mientras hojeaba algún código en línea un método con una firma como esta:

public List<Void> read( ... )

... ¿Qué? ¿Hay alguna razón para hacer esto? ¿Qué podría contener esto List? Por lo que yo sabía, no es posible crear instancias de un objeto Void.

Author: Roman C, 2012-11-23

4 answers

Es posible que esta firma de método se haya creado como un subproducto de alguna clase genérica.

Por ejemplo, SwingWorker tiene dos parámetros de tipo, uno para el resultado final y otro para los resultados intermedios. Si simplemente no desea utilizar ningún resultado intermedio, pasa Void como parámetro de tipo, lo que resulta en que algunos métodos devuelven Void, es decir, nada.

Si hubiera un método List<V> returnAllIntermediateResults() en SwingWorker con Void como el parámetro de tipo V, habría creado un método al igual que usted publicó en su pregunta.

El código sería perfectamente válido. Puede crear una instancia de cualquier implementación de la interfaz List (por ejemplo, ArrayList) con el parámetro de tipo Void. Pero el único valor que un tipo Void puede tener es null. Por lo tanto, la lista no podría contener nada más que nulls, si la implementación permite elementos null.

 23
Author: Jakub Zaverka,
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-12-20 08:43:13

Un caso en el que puede ser útil es si desea devolver una colección de valores devueltos de una función. Say

static List<T> forEach(Func<A,T> func, List<A> items) {
   List<T> ret = new List<T>();
   for(int i = 0; i< items.length; i++) {
     ret.add(func.call(items[i]);
   }
   return ret;
}

public static void main() {
  ...
  List<Void> boringResult = 
   forEach(
    new Func<Void, Integer> {@override Void call(Integer i) {...}});
}

No es tan útil, pero se puede ver un caso en el que se requiere.

 10
Author: David Waters,
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-11-22 20:45:17

List<Void> es raro. Solo puede tener elementos null, ya que no se puede crear un objeto de tipo Void. No creo que haya un uso práctico para tal cosa.

Void forma parte de java.lang. No es una palabra clave especial ni nada. Es un "pseudo-tipo" (de acuerdo con los documentos) usado para representar el objeto Class correspondiente a void, como en Class<Void>. De los documentos para Class:

Los tipos Java primitivos(boolean, byte, char, short, int, long, float, y double), y la palabra clave void también se representa como Class objetos.

La clase Void existe principalmente por el bien de la última parte de esto, por lo que puede escribir:

Class<Void> voidType = void.class; // == Void.TYPE

Al igual que usted puede escribir:

Class<Integer> intType = int.class; // == Integer.TYPE
 9
Author: Ted Hopp,
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-11-23 18:36:24

Estoy de acuerdo, es extraño.

Puedo ver un uso para él si desea extender una clase genérica y devolver void desde un método. Me he topado con un caso donde quiero usar int y tuve que usar Integer porque los genéricos de Java no les gustan los tipos primitivos.

public interface ObjectUserPool<E, T> {
    public E useObject(T o);
}

public class NonReturningObjectUserPool extends ObjectUserPool<Void, Integer> {
    public Void useObject(Integer i);
}

Creo que esto es lo que la API de Java está diciendo, aunque para ser honesto, realmente no puedo encontrar un uso para NonReturningObjectUserPool.

 4
Author: Cory Kendall,
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-11-22 20:32:18