2011-01-13 14 views
10

He notado el eclipse JDT uses void as a primitive type. ¿Se puede considerar esto correcto?En Java, ¿se puede considerar "nulo" como un tipo primitivo?

+0

Me pregunto si 'void' denota un tipo en absoluto? ¿O es simplemente un marcador de posición sintáctico? De la descripción del capítulo 4 de langspec, ciertamente suena como 'vacío' no es un tipo en absoluto. –

+0

JDT no es JLS. –

+0

He confirmado mi sospecha. 'void' es, pedantemente hablando, no un tipo. –

Respuesta

14

Encuentro que, en casos como este, no se puede superar ir a la Especificación del lenguaje Java. Está bastante claro el hecho de que void no es primitivo.

En primer lugar, void no está en el list of primitive types.Más tarde, el JLS afirma explícitamente:

el lenguaje de programación Java no permite un "fundido a vacío" — vacío no es un tipo http://java.sun.com/docs/books/jls/third_edition/html/statements.html#5989 (el énfasis es mío)

Además, void aparece en el list of keywords, no en la lista de literales.

La razón que viste lo que hiciste fue explained nicely por Michael Borgwardt.

Por lo tanto, para responder a su título: no. En Java, void no puede considerarse una primitiva. Para responder a su cuerpo: sí, el código Eclipse JDT es correcto para lo que necesita hacer.

+1

Personalmente, estoy desconcertado por qué los lenguajes de programación modernos no han seguido la convención nerdcore de nombrar "vacío" usando un acrónimo recursivo, p. Ej. VINAT: VINAT no es un tipo. :) –

8

No void no es un tipo primitivo. Es simplemente una palabra clave para indicar que un método no tiene valor de retorno. Lo más cerca que se puede llegar es la clase java.lang.Void, que desde el Javadocs se describe como:

La clase Void es un marcador de posición de clase crearse instancias para almacenar una referencia a la clase de objeto que representa el Java palabra clave nula

La presencia en el JDT es simplemente construir los AST para el código. Si nos fijamos en la descripción valor de campo en los mismos documentos que dice:

Código de tipo para el tipo primitivo "vacío". Tenga en cuenta que "void" es especial en que sus únicos usos legítimos son como un tipo de retorno de método y como un tipo literal.

+0

Gracias por la respuesta. +1 –

0

como sé, no es un tipo primitivo. Sin embargo, tienen esta constante en la clase Tipo por motivos de reflexión.

2

Desde su enlace:

Tenga en cuenta que "vacío" es especial, ya que sus únicos usos legítimos son como un tipo de retorno método y como un tipo literal.

Tenga en cuenta también que esta es una clase relacionada con los nodos AST, es decir, la sintaxis del lenguaje Java.

Básicamente, al modelar la sintaxis del lenguaje, void aparece en algunos de los mismos lugares que los tipos primitivos, por lo que cuando se representa la sintaxis como clase Java, debe clasificarla de manera similar.

0

aquí es lo escrito en javadoc al que hizo referencia:

Código de tipo para el tipo primitivo "vacío". Tenga en cuenta que "void" es especial en que sus únicos usos legítimos son como un tipo de retorno de método y como un literal de tipo.

Preste atención a la palabra en negrita. Creo que esto explica todo.

+1

Sin embargo, un tipo primitivo especial sigue siendo un tipo primitivo. Entonces la palabra "especial" no resuelve nada, ¿verdad? –

+0

Estoy de acuerdo con * Johannes Schaub - litb *. –

3

De Java 6 API docs:

pública booleano isPrimitive() - Determina si la clase especificada objeto representa un tipo primitivo.

Devuelve: verdadero si y sólo si esta clase representa un tipo primitivo

I comprobado por mí mismo:

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

¿Es error? Sé que el vacío es no tipo primitivo (creo que es solo palabra clave), pero ¿por qué void.class.isPrimitive() devuelve verdadero?

editar: Creo que debería aclararse, así que sugerí java: doc bug 7019906. En mi opinión, debería ser:

isPrimitive pública booleano() - Determina si la clase especificada objeto representa una primitiva de tipo o una palabra clave vacío.

Devuelve: verdadero si y solo si esta clase representa un tipo primitivo o una palabra clave void.

+0

No lo llamaría un error, pero sí, puede ser muy engañoso. Y el JLS no explica muy bien ese caso. –

Cuestiones relacionadas