36 votes

Quel est le but de la liste <Void> ?

Je ne savais même pas que c'était faisable, mais j'ai vu en parcourant du code en ligne une méthode avec une signature comme celle-ci:

 public List<Void> read( ... )
 

... Quelle? Y a-t-il jamais une raison de faire cela? Qu'est-ce que cette liste pourrait même contenir? Autant que je sache, il n'est pas possible d'instancier un objet Void .

24voto

Jakub Zaverka Points 5909

Il est possible que cette méthode de signature a été créé en tant que sous-produit de certains génériques de la classe.

Par exemple, SwingWorker a deux paramètres de type, un pour le résultat final et l'autre pour les résultats intermédiaires. Si vous ne voulez pas utiliser de résultats intermédiaires, vous passez Void que le paramètre de type, ce qui a entraîné certaines méthodes retournant Void - c'est à dire rien.

Si il y avait une méthode List<V> returnAllIntermediateResults() en SwingWorker avec Void que le paramètre de type V, il aurait créé une méthode tout comme vous avez posté votre question.

Le code serait parfaitement valable. Vous pouvez instancier la mise en œuvre des List interface (par exemple, ArrayList) avec un paramètre de type Void. Mais la seule valeur d'un Void type peut avoir est - null. Si la liste ne pouvait pas tenir à rien d'autre qu' nulls, si la mise en œuvre permet de null - éléments.

11voto

David Waters Points 6645

Dans certains cas, cela peut être utile si vous souhaitez renvoyer une collection de valeurs de retour à partir d'une fonction. Dire

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

Ce n'est pas utile, mais vous pouvez voir un cas où cela était nécessaire.

9voto

Ted Hopp Points 122617

List<Void> est bizarre. Elle ne peut avoir d' null éléments, puisque vous ne pouvez pas créer un objet de type Void. Je ne pense pas qu'il y est une utilisation pratique pour une telle chose.

Void fait partie d' java.lang. Ce n'est pas un mot-clé spécial ou quoi que ce soit. C'est un "pseudo-type" (selon les docs) utilisé pour une place de titulaire pour représenter l' Class objet correspondant à l' void, comme en Class<Void>. À partir de la documentation pour Class:

Les primitifs de Java types (boolean, byte, char, short, int, long, float, et double), et le mot-clé void sont également représentés en Class objets.

L' Void classe existe principalement pour le bien de la dernière partie de cela, vous pouvez écrire:

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

comme vous pouvez écrire:

Class<Integer> intType = int.class; // == Integer.TYPE

4voto

Cory Kendall Points 3403

Je suis d'accord, c'est étrange.

Je peux en voir l’utilisation si vous souhaitez étendre une classe générique et renvoyer void à partir d’une méthode. Je suis tombé sur un cas où je voulais utiliser int et je devais utiliser Integer parce que les génériques java n'aiment pas les types primitifs.

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

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

Je pense que c'est ce que dit l'API java, bien que pour être honnête, je ne trouve pas vraiment d'utilisation pour NonReturningObjectUserPool .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X