有一个Java Void
- 大写的V-- 引用类型.我见过它唯一的情况是参数化Callable
s
final Callablecallable = new Callable () { public Void call() { foobar(); return null; } };
Java Void
引用类型还有其他用途吗?可以分配除了以外的任何东西null
吗?如果是的话,你有例子吗?
Void
已经成为你不感兴趣的泛型参数的约定.没有理由你应该使用任何其他非可实例化的类型,例如System
.
它也经常被用于例如Map
值(虽然Collections.newSetFromMap
使用Boolean
的地图不具有接受null
值)和java.security.PrivilegedAction
.
我写了一篇博客文章在Void
几年前.
您可以使用反射创建Void实例,但它们对任何事物都没有用.Void是一种表示泛型方法不返回任何内容的方法.
Constructorconstructor = Void.class.getDeclaredConstructor(); constructor.setAccessible(true); Void v = constructor.newInstance(); System.out.println("I have a " + v);
打印像
I have a java.lang.Void@75636731
Future
像魅力一样工作.:)
鉴于没有公共构造函数,我会说除了之外不能分配任何东西null
.我只使用它作为"我不需要使用此通用参数"的占位符,如您的示例所示.
它也可以用于反射,它的Javadoc说:
Void类是一个不可实例化的占位符类,用于保存对表示Java关键字void的Class对象的引用.
所有的原始包装类(Integer
,Byte
,Boolean
,Double
,等等)包含在静态到对应的原语类的引用TYPE
字段,例如:
Integer.TYPE == int.class Byte.TYPE == byte.class Boolean.TYPE == boolean.class Double.TYPE == double.class
Void
最初被创建为某个地方以引入void
类型:
Void.TYPE == void.class
但是,通过使用你并没有真正获得任何东西Void.TYPE
.当你使用void.class
它时,你更清楚你正在做什么void
类型的东西.
顺便说一句,我最后一次尝试时,BeanShell没有识别void.class
,所以你必须在Void.TYPE
那里使用.
使用访问者模式时,如果要确保返回值为null,则可以更清晰地使用Void而不是Object
例
public interface LeavesVisitor{ OUT visit(Leaf1 leaf); OUT visit(Leaf2 leaf); }
当您实现访问者时,您可以明确地将OUT设置为Void,以便您知道访问者将始终返回null,而不是使用Object
public class MyVoidVisitor implements LeavesVisitor{ Void visit(Leaf1 leaf){ //...do what you want on your leaf return null; } Void visit(Leaf2 leaf){ //...do what you want on your leaf return null; } }
在泛型之前,它是为反射API创建的,用于保存Method.getReturnType()返回的TYPE,用于void方法,对应于其他基本类型类.
编辑:来自Void的JavaDoc:"Void类是一个不可实现的占位符类,用于保存对表示Java关键字void的Class对象的引用".在Generics之前,我意识到除了反射之外别无用处.