java.lang.Void
is analogous to java.lang.Integer
. Integer
is a way of boxing values of the primitive type int
. Void
is a way of boxing values of the primitive type void
.
"But wait, void
doesn‘t have any possible values!"
Right! That‘s what makes java.lang.Void
"uninstantiable". :)
It‘s a nice feature of the Java type system that every primitive type has a boxed equivalent. int
has Integer
, long
has Long
, byte
has Byte
... and void
has Void
. It would be weird and asymmetrical if Void
didn‘t exist.
"So what‘s the difference between java.lang.Void
and void
?"
Easy. void
is a primitive type. Void
is an reference type that inherits from Object
. They‘re similar in that neither of them has any possible values; but nevertheless they are two very different types, from the type system‘s point of view.
"But I don‘t have any use for Void
in my programs."
And I don‘t have any use for GarbageCollectorMXBean
in mine. Some features don‘t have non-obscure uses. That‘s okay.
The only point of Void
is to hold Void.TYPE
, which is sort of like void.class
. If you have a reflective reference to a method that returns void
, and you get its return type, it‘ll return Void.TYPE
.