2012-11-22 15 views
35

ich wusste nicht einmal, das war machbar, aber ich sah, während einige Code online eine Methode mit einer Signatur wie folgt durchlesen:Was ist der Zweck der Liste <Void>?

public List<Void> read(...) 

... Was? Gibt es jemals einen Grund, dies zu tun? Was könnte das List sogar halten? Soweit mir bekannt ist, ist es nicht möglich, ein Void Objekt zu instanziieren.

+0

in Java oder wo? – AlexWien

+1

Hat der Ort, an dem Sie den Code gesehen haben, nicht erklärt? Ich kann im Moment keinen Zweck dafür finden. – Pablo

+1

http://docs.oracle.com/javase/6/docs/api/java/lang/Void.html –

Antwort

23

Es ist möglich, dass Diese Methodensignatur wurde als Nebenprodukt einer generischen Klasse erstellt.

Zum Beispiel hat SwingWorker zwei Typparameter, einen für das Endergebnis und einen für die Zwischenergebnisse. Wenn Sie keine Zwischenergebnisse verwenden möchten, übergeben Sie Void als Typparameter, was dazu führt, dass einige Methoden Void zurückgeben - d. H. Nichts.

Wenn es eine Methode List<V> returnAllIntermediateResults() in SwingWorker mit Void als Typ-Parameter waren V, wäre es ein Verfahren geschaffen haben wie Sie in Ihrer Frage gestellt.

Der Code wäre perfekt gültig. Sie können jede Implementierung der Schnittstelle List (z. B. ArrayList) mit dem Typparameter Void instanziieren. Aber der einzige Wert, den ein Void Typ haben kann, ist null. So kann die Liste nichts anderes als null s enthalten, wenn die Implementierung null Elemente erlaubt.

+0

Ich sehe. Sehr interessant! Das ist wahrscheinlich, was ich gesehen habe. Sprechen Sie über verrückte Produkte. – asteri

+0

Gute Antwort, aber Sie können technisch eine Instanz von Void durch Reflektion erstellen. Ich habe keine Ahnung, warum du das jemals tun würdest. – Dunes

+2

@Jeff Ich mag den Void-Typ nicht sehr. Normalerweise, wenn ich es sehe, bedeutet das, dass eine fortgeschrittene, unverständliche Art von Zauberei vorgeht. Die einzige "wiederverwendbare" Verwendung, die ich sah, war mit dem SwingWorker. –

9

List<Void> ist seltsam. Es kann nur null Elemente haben, da Sie kein Objekt vom Typ Void erstellen können. Ich denke nicht, dass es einen praktischen Nutzen für so etwas gibt.

Void ist Teil von java.lang. Es ist kein spezielles Schlüsselwort oder so etwas. Es ist ein "Pseudo-Typ" (gemäß den Dokumenten), der als Platzhalter verwendet wird, um das Class Objekt zu repräsentieren, das void entspricht, wie in Class<Void>. Von the docs for Class:

Die primitiven Java-Typen (boolean, byte, char, short, int, long, float und double), und das Schlüsselwort void sind auch als Class Objekte dargestellt.

Die Void Klasse besteht in erster Linie aus Gründen des letzten Teils dieser, so können Sie schreiben:

Class<Void> voidType = void.class; // == Void.TYPE 

wie Sie schreiben können:

Class<Integer> intType = int.class; // == Integer.TYPE 
4

Ich stimme zu, es ist seltsam.

Ich kann eine Verwendung dafür sehen, wenn Sie eine generische Klasse erweitern und void von einer Methode zurückgeben möchten. Ich bin auf einen Fall gestoßen, wo ich int verwenden möchte und musste Integer verwenden, weil Java-Generika primitive Typen nicht mögen.

public interface ObjectUserPool<E, T> { 
    public E useObject(T o); 
} 

public class NonReturningObjectUserPool extends ObjectUserPool<Void, Integer> { 
    public Void useObject(Integer i); 
} 

Ich denke, das ist es, was der Java-API zu sagen, obwohl ich nicht wirklich ehrlich zu sein, eine Verwendung für NonReturningObjectUserPool finden.

+1

Sie können für jeden Referenztyp "null" zurückgeben. es erfordert nichts besonderes wie 'Void'. –

+1

@TedHopp guter Punkt, Antwort bearbeitet. Ich denke, es ist immer noch gültig, die Leere zurückzugeben, um selbstdokumentierend zu sein; anstatt zu behaupten, dass Sie Integer zurückgeben und intern immer null zurückgeben, und in javadoc behaupten, dass Sie immer null oder etwas zurückgeben. –

10

Ein Fall, in dem es nützlich sein kann, wenn Sie eine Sammlung von Rückgabewerten von einer Funktion zurückgeben möchten. Sprich

Nicht so nützlich, aber Sie könnten einen Fall sehen, wo es erforderlich war.

+0

Huh. Sprechen Sie über einen Randfall. Danke für deine Antwort! Sehr interessant. – asteri

+0

Fügen Sie 'java.concurrent.Future' und' Callable' der Liste hinzu. Dort ist ein "Void" -Rückgabetyp nicht ungewöhnlich. –

+0

Der einzig mögliche Rückgabewert von 'Void call (Integer i) {...}' ist 'null', da (nach [docs] (http://docs.oracle.com/javase/6/docs/) api/java/lang/Void.html)): _ "Die Void-Klasse ist eine ** nicht abbaubare ** Platzhalterklasse" _ (Hervorhebung hinzugefügt). Ich bin mir nicht sicher, wie nützlich es ist, eine Liste zu erstellen, die nur "Null" -Referenzen enthalten kann. –