In Java, can "void" be considered a primitive type?
Asked Answered
W

7

16

I've noticed eclipse JDT uses void as a primitive type. Can this be considered correct?

Weese answered 13/1, 2011 at 15:11 Comment(4)
I'm wondering whether void denotes a type at all? Or is it merely a syntactical placeholder? From the description of chapter 4 of the langspec, it certainly sounds like void isn't a type at all.Harr
I've confirmed my suspicion. void is, pedantically speaking, not a type.Harr
@"Johannes Schaub - litb" - can you give us the exact reference that enlightened you?Weese
@Lord already did. It was the same thing I read and what finally convinced me. :)Harr
E
19

I find that, in cases like this, you can't beat going to the Java Language Specification. It is pretty clear about the fact that void is not a primitive.

First off, void is not in the list of primitive types. Later on, the JLS explicitly states:

the Java programming language does not allow a "cast to void" — void is not a type http://java.sun.com/docs/books/jls/third_edition/html/statements.html#5989 (emphasis mine)

Furthermore, void appears in the list of keywords, not the list of literals.

The reason that you saw what you did was explained nicely by Michael Borgwardt.

So, to answer your title: no. In Java, void cannot be considered a primitive. To answer your body: yes, the Eclipse JDT code is correct for what it needs to do.

Esque answered 13/1, 2011 at 15:48 Comment(1)
Personally, I'm baffled why modern programming languages haven't followed the nerdcore convention of naming "void" using a recursive acronym, e.g. VINAT: VINAT Is Not A Type. :)Linda
L
8

No void is not a primitive type. It is simply a keyword to indicate a method has no return value. The closest you can come is the java.lang.Void class, which from the Javadocs is described as:

The Void class is an uninstantiable placeholder class to hold a reference to the Class object representing the Java keyword void.

The presence in the JDT is merely to build the ASTs for the code. If you look at the field value description in the same docs it says:

Type code for the primitive type "void". Note that "void" is special in that its only legitimate uses are as a method return type and as a type literal.

Leatherleaf answered 13/1, 2011 at 15:14 Comment(0)
S
3

From Java 6 API docs:

public boolean isPrimitive()

  • Determines if the specified Class object represents a primitive type.

Returns: true if and only if this class represents a primitive type

I checked for myself:

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

Is it bug ? I know that void is not primitive type (I think it is just keyword), but why void.class.isPrimitive() returns true ?

edit: I think it should be clarified, so I suggested java:doc bug 7019906. In my opinion it should be:

public boolean isPrimitive()

  • Determines if the specified Class object represents a primitive type or a keyword void.

Returns: true if and only if this class represents a primitive type or a keyword void.

Stereoscope answered 15/2, 2011 at 21:19 Comment(3)
I wouldn't call it a bug, but yes, it can be very misleading. And the JLS doesn't explain that case very well.Weese
It might be misleading, but it is definately not a bug, if you bother to further read the javadoc: "There are nine predefined Class objects to represent the eight primitive types and void. These are created by the Java Virtual Machine, and have the same names as the primitive types that they represent, namely boolean, byte, char, short, int, long, float, and double."Disturbance
On a side note, that link is broken or not publicly available.Disturbance
F
2

From your link:

Note that "void" is special in that its only legitimate uses are as a method return type and as a type literal.

Note also that this is a class concerned with AST nodes, i.e. the syntax of the Java language.

Basically, when modelling the language syntax, void appears in some of the same places as primitive types, so when representing the syntax as a Java class, you have to classify it similarly.

Famous answered 13/1, 2011 at 15:18 Comment(0)
A
0

as I know, void its not a primitive type. However they have this constant in the class Type for reflection reasons!

Anuradhapura answered 13/1, 2011 at 15:15 Comment(0)
B
0

here is what written in javadoc you referenced:

Type code for the primitive type "void". Note that "void" is special in that its only legitimate uses are as a method return type and as a type literal.

Pay attention on the bold word. I think this explains everything.

Branny answered 13/1, 2011 at 15:20 Comment(2)
A special primitive type is still a primitive type though. So the word "special" doesn't solve anything does it?Harr
I agree with Johannes Schaub - litb.Weese
M
-1

I see you argue a lot about this but...

hey guys, there is a function named isPrimitive() in java.lang.Class

so why don't we invoke it with void class object and get the answer?

enter image description here

besides, Void.TYPE is get using Class.getPrimitiveClass("void").

So the fact is clear, void IS primitive.

enter image description here

Misfit answered 24/4, 2020 at 13:59 Comment(1)
If you read the documentation of the isPrimitive() function, it makes it pretty clear that void is not a primitive: "There are nine predefined Class objects to represent the eight primitive types and void. These are created by the Java Virtual Machine, and have the same names as the primitive types that they represent, namely boolean, byte, char, short, int, long, float, and double."Disturbance

© 2022 - 2024 — McMap. All rights reserved.