Ich implementiere a ResponseHandler
für das Apache HttpClient-Paket wie folgt:
new ResponseHandler<int>() {
public int handleResponse(...) {
// ... code ...
return 0;
}
}
aber ich möchte, dass die handleResponse
Funktion nichts zurückgibt, dh void
. Ist das möglich? Folgendes wird seitdem nicht kompiliertvoid
es sich nicht um einen gültigen Java-Typ handelt:
new ResponseHandler<void>() {
public void handleResponse(...) {
// ... code ...
}
}
Ich nehme an, ich ersetzen könnte void
mit Void
zurück ein Void
Objekt, aber das ist nicht wirklich das, was ich will. Frage : Ist es möglich , diesen Rückruf Situation derart zu organisieren , dass ich zurückkehren kann void
aus handleResponse
?
quelle
return
Anweisung in eine Funktion aufnehmen zu müssen, in der ich nichts zurückgebe, hauptsächlich aus Gründen der Sauberkeit.void
Methode aufruft und zurückkehrtnull
, um diese Hässlichkeit zu verbergen.Object
Typ zurück, wenn es funktioniertDer
Void
Typ wurde genau für diese Situation erstellt: um eine Methode mit einem generischen Rückgabetyp zu erstellen, bei dem ein Subtyp "void" sein kann.Void
wurde so konzipiert, dass möglicherweise keine Objekte dieses Typs erstellt werden können. Daher wird eine Methode vom TypVoid
immer zurückkehrennull
(oder abnormal abgeschlossen werden), was so nahe an nichts liegt, wie Sie es bekommen werden. Du musst setzenreturn null
die Methode eingeben, dies sollte jedoch nur eine geringfügige Unannehmlichkeit sein.Kurzum: Verwenden Sie
Void
.quelle
void
müssen keinen Wert zurückgeben. Methoden mit einem RückgabetypObject
oder einer beliebigen Unterklasse, z. B.Void
müssen einen Wert zurückgeben (oder sind normalerweise nicht vollständig). Der einzige Wert, derVoid
einerVoid
Methode zugewiesen und von dieser zurückgegeben werden kann, istnull
.Wenn Sie zurückkehren müssen, kehren Sie
java.lang.Void
einfach zurücknull
.quelle
Leider ist es nicht möglich. Sie können den Code so einstellen, dass er
Void
wie gesagt zurückgibt, Sie können jedoch niemals a instanziierenVoid
sodass Sie keine Funktion schreiben können, die dieser Spezifikation entspricht.Stellen Sie sich das so vor: Die generische Funktion sagt "Diese Funktion gibt etwas vom Typ X zurück", und Sie können X angeben, aber Sie können den Satz nicht in "Diese Funktion gibt nichts zurück" ändern. (Ich bin nicht sicher, ob ich mit dieser Semantik einverstanden bin, aber so sind sie.)
In diesem Fall mache ich immer nur die Funktion return type
Object
und tatsächlich immer returnnull
.quelle
static Void v() { return null; }
static Void n() { return "NotAllowed"; }
static Object o() { return "Allowed"; }
Sie können keine Primitiven in Generika haben, also
int
ist das eigentlich eineInteger
. Das ObjektVoid
ist analog zum Schlüsselwortvoid
für Generika.quelle
void
ist kein Grundelement, sondern lediglich ein Java-Schlüsselwort. Es hat keinen "Typ"void
(Kleinbuchstaben) - Schlüsselwort, nichts zurückgegeben;Void
(Großbuchstaben) - eine (nicht instabilisierbare) Klasse , wobei eine Instanz dieser Klasse zurückgegeben wird (kann nurnull
seitdem nicht instabilisierbar sein)Diese Implementierung von java.lang.Void in Java spricht für sich. Außerdem habe ich einen Artikel geschrieben, der dies mit Generika verbindet. Es dauerte ein bisschen, bis ich anfing, dies zu verstehen: http://www.siteconsortium.com/h/D00006.php . Beachten Sie TYPE = Class.getPrimitiveClass ("void");
Paket java.lang;
public final class Void { public static final Class<Void> TYPE = Class.getPrimitiveClass("void"); private Void() {} }
quelle