Was ist der richtige Weg, um einen Void
Typ zurückzugeben, wenn er kein Grundelement ist? Z.B. Ich benutze derzeit null wie unten.
interface B<E>{ E method(); }
class A implements B<Void>{
public Void method(){
// do something
return null;
}
}
java
generics
return-value
Robert
quelle
quelle
Antworten:
Folgendes würde also ausreichen:
Object
und zurückgebennew Object()
odernull
Void
und Zurückgebennull
NullObject
von IhnenSie können diese Methode nicht ausführen
void
, und alles andere gibt etwas zurück . Da dieses Etwas ignoriert wird, können Sie alles zurückgeben.quelle
return (Void)null;
Java 8 hat eine neue Klasse eingeführt,
Optional<T>
die in solchen Fällen verwendet werden kann. Um es zu verwenden, würden Sie Ihren Code wie folgt leicht ändern:Auf diese Weise können Sie sicherstellen, dass Ihre Methode immer einen Rückgabewert ungleich Null erhält, auch wenn nichts zurückgegeben werden muss. Dies ist besonders leistungsfähig, wenn es in Verbindung mit Tools verwendet wird, die erkennen, wann zurückgegeben werden
null
kann oder nicht, z. B. Eclipse@NonNull
und@Nullable
Anmerkungen.quelle
Optional<Void>
ist aus dem gleichen Grund, den Sie angeben, nicht erforderlich. Sie erhalten immer einOptional<Void>
, das leer ist, und daher sind alle anderen Methoden sinnlos. Dies ist das Gegenteil davon, warum ein optionaler Wert verwendet werden sollte. Sie verwenden es, weil es einen Wert haben kann oder nicht. Außerdem kann der Compiler nicht erzwingen, dassmethod()
er korrekt implementiert wird. Dies würde zur Laufzeit fehlschlagen :return Optional.of(null)
.Wenn Sie einfach nichts als Typ benötigen, können Sie void verwenden. Dies kann zum Implementieren von Funktionen oder Aktionen verwendet werden. Sie könnten dann so etwas tun:
Oder Sie können die abstrakte Klasse weglassen und die Rückgabe null in jeder Aktion ausführen, für die selbst kein Rückgabewert erforderlich ist.
Sie können diese Aktionen dann folgendermaßen verwenden:
Eine Methode gegeben
man kann es so nennen
oder für die void-Aktion (beachten Sie, dass Sie das Ergebnis nichts zuweisen)
quelle
Nur deswegen gibt es natürlich die Möglichkeit, eine
Void
Instanz mithilfe von Reflexion zu erstellen :Das werden Sie in der Produktion wahrscheinlich nicht tun.
quelle
Es gibt keinen generischen Typ, der dem Compiler mitteilt, dass eine Methode nichts zurückgibt.
Ich glaube, die Konvention besteht darin, Object beim Erben als Typparameter zu verwenden
ODER
Verbreiten Sie den Typparameter nach oben und lassen Sie die Benutzer Ihrer Klasse mithilfe von Object instanziieren und das Objekt einer Variablen zuweisen, die mit einem Typ-Platzhalter eingegeben wurde
?
:quelle
A<?>
kann den zurückgegebenen Wert von nicht verwendenmethod()
.