Uses for the Java Void Reference Type?
Void
has become convention for a generic argument that you are not interested in. There is no reason why you should use any other non-instantiable type, such as System
.
It is also often used in for example Map
values (although Collections.newSetFromMap
uses Boolean
as maps don't have to accept null
values) and java.security.PrivilegedAction
.
You can create instance of Void using reflections, but they are not useful for anything. Void is a way to indicate a generic method returns nothing.
Constructor<Void> constructor = Void.class.getDeclaredConstructor();
constructor.setAccessible(true);
Void v = constructor.newInstance();
System.out.println("I have a " + v);
prints something like
I have a java.lang.Void@75636731
Future<Void>
works like charm. :)
Given that there are no public constructors, I would say it can't be assigned anything other than null
. I've only used it as a placeholder for "I don't need to use this generic parameter," as your example shows.
It could also be used in reflection, from what its Javadoc says:
The Void class is an uninstantiable placeholder class to hold a reference to the Class object representing the Java keyword void.
All the primitive wrapper classes (Integer
, Byte
, Boolean
, Double
, etc.) contain a reference to the corresponding primitive class in a static TYPE
field, for example:
Integer.TYPE == int.class
Byte.TYPE == byte.class
Boolean.TYPE == boolean.class
Double.TYPE == double.class
Void
was initially created as somewhere to put a reference to the void
type:
Void.TYPE == void.class
However, you don't really gain anything by using Void.TYPE
. When you use void.class
it's much clearer that you're doing something with the void
type.
As an aside, the last time I tried it, BeanShell didn't recognise void.class
, so you have to use Void.TYPE
there.