2013-01-08 8 views
6

Possible Duplicate:
What is the difference between java.lang.Void and void?Impostazione dei tipi generici di SwingWorker come nulli?

ho voluto creare una classe concreta per SwingWorker con entrambi i tipi risultato finale e intermedi come void. Ho scritto il seguente codice:

class AnswerWorker extends SwingWorker<void, void> { 
    protected void doInBackGround() { 
     System.out.println("what is your problem!!"); 
    } 
} 

questo mi ha dato il seguente errore:

Multiple markers at this line- 
    Syntax error on token "void", Dimensions expected after this token. 
    Syntax error on token "void", Dimensions expected after this token. 

Tuttavia quando ho cambiato il codice da void a Void (cioè piccolo v al capitale V), ha funzionato bene, anche se ero ancora costretto a return null; alla fine del metodo doInBackground().

Perché è questo? So che Void è una classe nel pacchetto java.lang ma la documentazione non dice molto su di esso (almeno non quale potrei seguire: p)

Grazie in anticipo !!

+0

e importante potrebbe essere due parametri, ci sono davvero mKorbel

risposta

11

class AnswerWorker extends SwingWorker<Void, Void>
Dovrebbe fare il trucco. Questo perché i generici hanno sempre bisogno di oggetti come parametri. Inoltre non possono prendere le primitive. Void è come un wrapper per sbarazzarsi di questo problema.

Ora il motivo per cui è ancora necessario restituire qualcosa:
Come dice la documentazione, Void è ancora una classe. Quindi devi ancora restituire un oggetto. Dal momento che non è affidabile, c'è solo la possibilità di restituire null. Quindi Void non è del tutto simile alla parola chiave void. C'è ancora la necessità di restituire un riferimento a un oggetto (riferimento null in questo caso).

C'è una cosa importante: Generics ti obbliga a utilizzare gli oggetti.void, come i tipi primitivi, non è un oggetto. Questa è la natura pura OOP di Java;)

3

La classe java.lang.Void stato originariamente introdotto molto prima generici come luogo per mettere il costante Void.TYPE, l'oggetto Class che rappresenta il tipo void, e che viene restituito da java.lang.reflect.Method.getReturnType() per void metodi (per analogia a Integer.TYPE, Character.TYPE, ecc. che rappresentano int, char, ...).

La classe Void non può essere istanziata (quindi l'unico valore valido è possibile assegnare ad una variabile di tipo Void è null) ma è stato cooptato dall'introduzione dei generici come segno utile per situazioni come questa dove la sintassi richiede un nome di classe ma non si vuole veramente usarne uno.

+0

Potresti indicarmi qualche documentazione ufficiale/autorevole per confermare questa frase nel contesto di 'SwingWorker' ?: _it è stato cooptato dall'introduzione di generici come un gettone utile per situazioni come questa in cui la sintassi richiede un nome di classe ma non si vuole veramente usarne una_. –

+0

@JaimeHablutzel Non posso, ho scelto il termine "cooptato" per implicare che si tratta di una convenzione non ufficiale piuttosto che di una raccomandazione ufficiale.Se restituisci sempre 'null', allora non importa quale classe usi, ma' Void' è una convenzione utile. La stessa convenzione è usata da ['java.util.concurrent.RecursiveAction'] (https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/RecursiveAction.html), è un" "ForkJoinTask'" che restituisce sempre "null", quindi estende 'ForkJoinTask '. –

+0

il fatto che ci sia una classe nell'API Java standard usando 'Void' come se mi sembrasse un riferimento abbastanza ufficiale. Grazie!. –