web-dev-qa-db-fra.com

Quelle est la différence entre Java.lang.Void et void?

Dans l'API

"La classe Void est une classe d'espace réservé non instanciable pour contenir une référence à l'objet Class représentant le mot-clé Java void."

  1. Qu'est-ce qu'une classe d'espace réservé "non instable"? Quand est-ce que Java.lang.Void être utilisé? Si la classe est "non instable", à quoi sert-elle?
  2. Quelle est la différence entre Java.lang.Void et void?
55
user1357722

seul point de Void doit contenir Void.TYPE, qui est un peu comme void.class. Si vous avez une référence réfléchie à une méthode qui renvoie void et que vous obtenez son type de retour, elle renverra Void.TYPE.

Vous ne pouvez pas et ne devez pas l'utiliser pour autre chose.

50
Louis Wasserman

Java.lang.Void est analogue à Java.lang.Integer . Integer est un moyen de mettre des valeurs de boxe de type primitif int. Void est un moyen de mettre des valeurs de boxe de type primitif void.

"Mais attendez, void n'a aucune valeur possible!"

Droite! C'est ce qui fait que Java.lang.Void "non instable". :)

C'est une fonctionnalité intéressante du système de type Java que chaque type primitif a un équivalent encadré. int a Integer, long a Long, byte a Byte ... et void a Void. Ce serait bizarre et asymétrique si Void n'existait pas .

"Alors, quelle est la différence entre Java.lang.Void et void? "

Facile. void est un type primitif. Void est un type de référence qui hérite de Object. Ils sont similaires dans la mesure où aucun d'eux n'a de valeur possible; mais néanmoins ce sont deux types très différents, du point de vue du système de types.

"Mais je n'ai aucune utilité pour Void dans mes programmes."

Et je n'ai aucune utilité pour GarbageCollectorMXBean dans le mien. Certaines fonctionnalités n'ont pas des utilisations non obscures. C'est bon.

94
Quuxplusone

L'utilisation la plus courante de Void est pour la réflexion, mais ce n'est pas le seul endroit où elle peut être utilisée.

void est un mot clé qui signifie qu'une fonction ne produit pas de valeur.

Java.lang.Void est un type de référence, alors ce qui suit est valide:

 Void nil = null;

(Pour l'instant ce n'est pas intéressant ...)

En tant que type de résultat (une fonction avec une valeur de retour de type Void), cela signifie que la fonction * toujours * retourne null (elle ne peut pas renvoyer autre chose que null, car Void n'a pas d'instances).

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

Pourquoi voudrais-je une fonction qui toujours renvoie null?

Avant l'invention des génériques, je n'avais pas de cas d'utilisation pour Void.

Avec les génériques, il y a des cas intéressants. Par exemple, un Future<T> est un support pour le résultat d'une opération asynchrone effectuée par un autre thread. Future.get renverra la valeur de l'opération (de type T) et se bloquera jusqu'à ce que le calcul soit effectué.

Mais ... Et s'il n'y a rien à retourner? Simple: utilisez un Future<Void>. Par exemple, dans Google App Engine, le service Asyncronous Datastore delete renvoie un future. Whenavoir()is invoked on that future,null` est retourné après la suppression est terminée. On pourrait écrire un exemple similaire avec Callable s.

Un autre cas d'utilisation est un Map sans valeurs, c'est-à-dire un Map<T,Void>. Une telle carte se comporte comme un Set<T>, alors cela peut être utile quand il n'y a pas d'implémentation équivalente de Set (par exemple, il n'y a pas de WeakHashSet, alors on pourrait utiliser un WeakHashMap<T,Void> ).

50
Javier

Void est une fonction AutoBoxing (depuis JDK 1.5) de void.

bien son explication que Void est une référence tandis que void est un type primitif.

Alors, où l'exigence vient d'avoir à utiliser Void ???

Une utilisation courante avec les types génériques où nous ne pouvons pas utiliser de primitive.

Disons, en cas de Android AsyncTaks<Params, Progress, Result> que faire si je ne veux pas recevoir la mise à jour de Progress. Je ne peux pas utiliser void (type primitif) ici, nous avons besoin de Java.lang.Void

5
Amit Yadav

Un autre exemple d'utilisation de Void est SwingWorker

new SwingWorker<Void, Integer> () {
    @Override
    protected Void doInBackground(){
        ...
    }
    @Override
    protected void process(List<Integer> chunk){
        ...
    }
    @Override
    public void done(){
        ...
    }
}.execute();
2
Maxwell Cheng

Void est utile car parfois vous devez spécifier le type de retour d'une méthode en dehors de la méthode elle-même.

Par exemple, prenez ceci expression lambda Java 8 , qui vérifie si un objet EventResource a certaines propriétés, en utilisant une méthode appelée checkBenefitConcertInCentralPark, passée dans la méthode checkCreatedEvent:

eventChecker.checkCreatedEvent(TestEvents::checkBenefitConcertInCentralPark);

La méthode checkBenefitConcertInCentralPark est définie comme ceci (notez l'utilisation 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
    }

puis la méthode checkBenefitConcertInCentralPark est passée dans la méthode checkCreatedEvent.

    // Function<EventResource, Void> describes the checkBenefitConcertInCentralPark method
    public void checkCreatedEvent(Function<EventResource, Void> function) { 
        function.apply(this.eventResource);
    }
1
John Deverall