2013-03-21 17 views
12

Was genau ist der Unterschied zwischen Void, void, und kann ich einfach null stattdessen verwenden?java.lang.Void vs void vs Null

Ich frage, das ist, weil ich Beispiel-Android-Code, wo sie Void aber Eclipse-Fehler verwendet haben (es sagt Void cannot be resolved to a variable).

Mein Code, der bricht, ist

public class MyAsyncTask extends AsyncTask<Void, Void, Boolean>{ 
    ... 
} 

ich es wie dies

MyAsyncTask myAsyncTask = new MyAsyncTask(); 
myAsyncTask.execute((Void),null);//this is the line that breaks "Void cannot be resolved to a variable" 
+0

Es würde helfen, wenn wir den Code sehen konnte, die zu brechen war. –

+0

Ich werde ein kleines Snippet hinzufügen. nur aufräumen – Josh

+0

übrigens können Sie auch versuchen myAsyncTask.execute (new Void [1]); = D –

Antwort

2

Sie haben ein zusätzliches Komma in Ihrem Code.

myAsyncTask.execute((Void),null); 
         //^extra comma right here 

Auch gibt es keine Notwendigkeit, null zu Void zu werfen, weil (1) Void keine Instanzen haben und somit gibt es kein Void Objekt, und (2) Gießen null zu etwas ist ziemlich nutzlos, weil null a Gültiger Wert für einen beliebigen Objektdatentyp.

-Code sollte wahrscheinlich nur sein:

myAsyncTask.execute(null); 
+1

es war das extra Komma Danke! Ich erkannte nicht, dass es eine Besetzung (ich dachte, seine zwei Args) aber aus irgendeinem Grund muss es gegossen werden, sonst es ausgibt sagen "Ausführen (void []) ist mehrdeutig für den Typ MyAsyncTask" – Josh

+2

Die sicherste Wette in diesem Fall ist eigentlich 'myAsyncTask.execute();' – battery

0

java.lang.Void ist die eingerahmte Darstellung des Typs void. Da Sie keine Instanz des Typs void haben können, ist dies meistens der Vollständigkeit halber und dem sehr seltenen Fall, in dem Sie es zur Reflexion benötigen.

+0

' java.lang.Void' ist * nicht * die [umrahmte Darstellung] (http://en.wikipedia.org/wiki/Object_type_ (objektorientierte_programmierung) #Boxing) von 'void'. Wenn Sie eine Box-Darstellung aufrufen, bedeutet dies, dass Sie ein Primitiv umschließen. 'void' ist kein Primitiv, noch ist es ein Typ, und es findet kein Wrapping statt. – Jeffrey

+0

Einige Ressourcen, wie http://www.idevelopment.info/data/Programming/java/miscellent_java/Java_Primitive_Types.html, nennen 'void' einen primitiven Typ. Es ist sicherlich keine Klasse. Es ist der ganze Zweck, für den primitiven Typ des äquivalenten Zwecks einzutreten, was "boxed represents" tatsächlich tun. – Wug

+0

Die [Java Langauge Specification] (http://docs.oracle.com/javase/specs/jls/se7/html/jls-14.html#jls-14.8) gibt an, dass 'void' kein Typ ist. – Jeffrey

39

Die häufigste Verwendung von Void ist für die Reflexion, aber das ist nicht der einzige Ort, wo es verwendet werden kann.

void ist ein Schlüsselwort, das bedeutet, dass eine Funktion keinen Wert ergibt.

java.lang.Void ein Referenztyp ist, dann gilt folgendes:

Void nil = null; 

(so weit es nicht interessant ist ...)

Als Ergebnis Typ (eine Funktion mit einem Rückgabewert von Geben Sie Void) es bedeutet, dass die Funktion * immer * null zurückgibt (es kann nichts anders als null zurückgeben, da Void keine Instanzen hat).

Void function(int a, int b) { 
    //do something 
    return null; 
} 

Warum sollte ich eine Funktion, dass immer kehrt null gefallen hat?

Vor der Erfindung von Generika hatte ich keinen Anwendungsfall für Void.

Mit Generika gibt es einige interessante Fälle. Zum Beispiel ist ein Future<T> ein Halter für das Ergebnis einer asynchronen Operation, die von einem anderen Thread durchgeführt wird. Future.get gibt den Operationswert (vom Typ T) zurück und blockiert solange, bis die Berechnung ausgeführt wird.

Aber ... was ist, wenn es nichts gibt, das zurückkommt? Einfach: Verwenden Sie eine Future<Void>. In Google App Engine gibt der Asyncronous Datastore Service delete einen Future<Void> zurück.Wenn get() in dieser Zukunft aufgerufen wird, wird null zurückgegeben nach das Löschen abgeschlossen ist. Man könnte ein ähnliches Beispiel mit Callable s schreiben. Ein anderer Anwendungsfall ist ein Map ohne Werte, d.h. ein Map<T,Void>. Solch eine Karte verhält sich wie eine Set<T>, dann kann es nützlich sein, wenn es keine äquivalente Implementierung von Set gibt (zum Beispiel gibt es keine WeakHashSet, dann könnte man eine WeakHashMap<T,Void> verwenden).

+0

das ist ein sehr guter einblick Ich wünschte, ich kann zwei Antworten als die richtige markieren .. – Josh

+0

Gute Erklärung Javier. Vielen Dank – Stephan