2011-01-13 10 views
10

Ho notato eclissi JDT uses void as a primitive type. Questo può essere considerato corretto?In Java, si può "annullare" essere considerato un tipo primitivo?

+0

Mi chiedo se "void" sia per niente un tipo? O è semplicemente un segnaposto sintattico? Dalla descrizione del capitolo 4 del langspec, suona certamente come "void" non è affatto un tipo. –

+0

JDT non è JLS. –

+0

Ho confermato il mio sospetto. 'void' è, pedanticamente parlando, non un tipo. –

risposta

14

Trovo che, in casi come questo, non si possa battere andando alle Specifiche del linguaggio Java. È abbastanza chiaro che lo void non è un primitivo.

Prima di tutto, void non è nello list of primitive types.In seguito, il JLS afferma esplicitamente:

il linguaggio di programmazione Java non permette un "cast vuoto" — vuoto non è un tipo http://java.sun.com/docs/books/jls/third_edition/html/statements.html#5989 (sottolineatura mia)

Inoltre, void appare nello list of keywords, non nell'elenco di valori letterali.

che hai visto quello che hai fatto era explained nicely di Michael Borgwardt.

Quindi, per rispondere al tuo titolo: no. In Java, void non può essere considerato un primitivo. Per rispondere al tuo corpo: sì, il codice JDT di Eclipse è corretto per quello che deve fare.

+1

Personalmente, sono sconcertato perché i moderni linguaggi di programmazione non hanno seguito la convenzione nerdcore di nominare "void" usando un acronimo ricorsivo, ad es. VINAT: VINAT non è un tipo. :) –

8

Nessun vuoto non è un tipo primitivo. È semplicemente una parola chiave per indicare che un metodo non ha alcun valore di ritorno. Il più vicino si può venire è la classe java.lang.Void, che dal Javadocs è descritto come:

La classe Void è un istanziabili classe segnaposto per contenere un riferimento all'oggetto classe che rappresenta il Java parola chiave non valida.

La presenza nel JDT è semplicemente la creazione degli AST per il codice. Se si guarda la descrizione del valore del campo negli stessi documenti, si dice:

Codice tipo per il tipo primitivo "vuoto". Si noti che "void" è speciale in che i suoi unici usi legittimi sono come un tipo di ritorno del metodo e come un tipo letterale .

+0

Grazie per la risposta. +1 –

0

come so, annullare il suo non un tipo primitivo. Tuttavia hanno questa costante nel tipo di classe per ragioni di riflessione!

2

dal tuo link:

nota che "vuoto" è speciale in quanto i suoi solo gli usi legittimi sono come un tipo di ritorno metodo e come un tipo letterale.

Si noti inoltre che questa è una classe interessata con nodi AST, ovvero la sintassi del linguaggio Java.

Fondamentalmente, quando si modella la sintassi del linguaggio, void appare in alcune delle stesse posizioni dei tipi primitivi, quindi quando si rappresenta la sintassi come una classe Java, è necessario classificarlo in modo simile.

0

qui è quello scritto in javadoc si fa riferimento:

Codice tipo per il tipo primitivo "vuoto". Si noti che "void" è speciale in quanto i suoi unici usi legittimi sono come un tipo di ritorno del metodo e come un tipo letterale.

Prestare attenzione alla parola in grassetto. Penso che questo spieghi tutto.

+1

Un tipo primitivo speciale è comunque un tipo primitivo. Quindi la parola "speciale" non risolve nulla, vero? –

+0

Sono d'accordo con * Johannes Schaub - litb *. –

3

Da Java 6 API docs:

pubblico booleana isPrimitive() - Determina se l'oggetto Class specificato rappresenta un tipo primitivo.

Returns: true se e solo se questa classe rappresenta un tipo primitivo

ho controllato per me stesso:

void.class.getName() // void (OK) 
void.class.isPrimitive() // true (??) 
Void.class.getName() // java.lang.Void (OK) 
Void.class.isPrimitive() // false (OK) 

E 'bug? So che il vuoto è non tipo primitivo (penso sia solo parola chiave), ma perché void.class.isPrimitive() restituisce true?

modifica: Penso che dovrebbe essere chiarito, quindi ho suggerito java: doc bug 7019906. A mio parere dovrebbe essere:

pubblico isPrimitive booleana() - Determina se l'oggetto Class specificato rappresenta un tipo primitivo o una parola chiave vuoto.

Restituisce: true se e solo se questa classe rappresenta un tipo primitivo o una parola chiave void.

+0

Non lo definirei un bug, ma sì, può essere molto fuorviante. E il JLS non spiega molto bene questo caso. –

Problemi correlati