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
?
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
?
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
.
Lorsque vous devez retourner Java.lang.Void
, il suffit de retourner null
.
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.
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
.
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() {}
}