web-dev-qa-db-fra.com

Java génériques types void / Void

J'implémente un ResponseHandler pour le paquet Apache HttpClient, comme ceci:

new ResponseHandler<int>() {
    public int handleResponse(...) {
        // ... code ...
        return 0;
    }
}

mais j'aimerais que la fonction handleResponse ne renvoie rien, c'est-à-dire void. Est-ce possible? Ce qui suit ne se compile pas, car void n'est pas un type Java Java valide:

new ResponseHandler<void>() {
        public void handleResponse(...) {
            // ... code ...
        }
}

Je suppose que je pourrais remplacer void par Void pour renvoyer un objet Void, mais ce n'est pas vraiment ce que je veux. Question: est-il possible d'organiser cette situation de rappel de telle manière que je puisse retourner void de handleResponse?

65
Travis Webb

Generics ne gère que les classes d'objets. les types void et primitive ne sont pas pris en charge par Generics et vous ne pouvez pas les utiliser comme type paramétré. Vous devez utiliser Void à la place.

Pouvez-vous dire pourquoi vous ne voulez pas utiliser Void?

51
Peter Lawrey

Le type Void a été créé pour cette situation exacte: pour créer une méthode avec un type de retour générique où un sous-type peut être "void". Void a été conçu de manière à ce qu'aucun objet de ce type ne puisse être créé. Ainsi, une méthode de type Void renverra toujours null (ou se terminera de façon anormale), ce qui est aussi proche de rien que vous allez en obtenir. Vous devez mettre return null dans la méthode, mais cela ne devrait être qu'un inconvénient mineur.

En bref: utilisez Void.

79
ILMTitan

Lorsque vous devez retourner Java.lang.Void, il suffit de retourner null.

4
Ken Chu

Vous ne pouvez pas avoir de primitives dans les génériques afin que int soit en fait un integer. L'objet Void est analogue au mot clé void pour les génériques.

1
Tnem

Hélas, ce n'est pas possible. Vous pouvez définir le code pour renvoyer Void comme vous le dites, mais vous ne pouvez jamais instancier un Void de sorte que vous ne pouvez pas réellement écrire une fonction qui est conforme à cette spécification.

Considérez-le comme: La fonction générique dit "cette fonction renvoie quelque chose, de type X", et vous pouvez spécifier X mais vous ne pouvez pas changer la phrase en "cette fonction ne renvoie rien". (Je ne sais pas si je suis d'accord avec ces sémantiques, mais c'est comme ça.)

Dans ce cas, ce que je fais toujours, c'est juste de faire que la fonction retourne le type Object, et en fait toujours retourne null.

1
Adrian Smith

Cette implémentation Java.lang.Void en Java sorte de parle pour lui-même. En outre, j'ai écrit un article qui lie cela en génériques. Il a fallu un peu de réflexion avant de commencer à comprendre cela: - http://www.siteconsortium.com/h/D00006.php . Notice TYPE = Class.getPrimitiveClass ("void");

package Java.lang;

public final class Void {

    public static final Class<Void> TYPE = Class.getPrimitiveClass("void");

    private Void() {}
}
0
Jon