用于Java Void引用types?

有一个Java Void – 大写的V– 参考types 。 我见过的唯一的情况是参数化Callable

 final Callable<Void> callable = new Callable<Void>() { public Void call() { foobar(); return null; } }; 

Java Void引用types还有其他用途吗? 它可以分配任何非null ? 如果是的话,你有例子吗?

Void已经成为您不感兴趣的一般性论证的惯例。没有理由为什么您应该使用任何其他不可实例化的types,比如System

它也经常用于例如Map值(尽pipeCollections.newSetFromMap使用Boolean因为地图不必接受null值)和java.security.PrivilegedAction

几年前,我在Void上写了一个博客条目 。

你可以使用reflection来创buildVoid的实例,但是它们对于任何东西都是没有用的。 无效是一种方法来表明一个通用的方法没有返回任何东西。

 Constructor<Void> constructor = 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<Void>像魅力。 🙂

鉴于没有公共的构造函数 ,我只能说它不能被分配除null以外的任何东西。 我只用它作为“我不需要使用这个通用参数”的占位符,如你的例子所示。

它也可以用于反思,从它的Javadoc说:

Void类是一个不合理的占位符类,用于保存对表示Java关键字void的Class对象的引用。

所有原始包装类( IntegerByteBooleanDouble等)都包含对静态TYPE字段中相应基本类的引用,例如:

 Integer.TYPE == int.class Byte.TYPE == byte.class Boolean.TYPE == boolean.class Double.TYPE == double.class 

Void最初被创build为某个地方来提及voidtypes:

 Void.TYPE == void.class 

但是,通过使用Void.TYPE ,你并没有真正获得任何东西。 当你使用void.class的时候,你会用voidtypes来做更清晰的事情。

void.class一下,最后一次尝试它, BeanShell不承认void.class ,所以你必须在那里使用Void.TYPE

在使用访问者模式时,如果要确保返回值为空,则可以使用Void而不是Object。

 public interface LeavesVisitor<OUT> { OUT visit(Leaf1 leaf); OUT visit(Leaf2 leaf); } 

当你实现你的访问者时,你可以明确地将OUT设置为Void,这样你就知道你的访问者将总是返回null,而不是使用Object

 public class MyVoidVisitor implements LeavesVisitor<Void> { 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; } } 

在generics之前,它是为reflectionAPI创build的,为void方法返回由Method.getReturnType()返回的TYPE,对应于其他基本types类。

编辑:从Void的JavaDoc:“Void类是一个不合理的占位符类来持有代表Java关键字无效的类对象的引用”。 在generics之前,我知道没有其他用途,除了反思。

void创build包装其原始的voidtypes。 每个原始types都有相应的引用types。 void用于实例化一个generics类或使用generics方法,一个你不感兴趣的generics参数,这里是一个例子…

 public void onNewRegistration() { newRegistrationService.createNewUser(view.getUsername(), view.getPassword(), view.getInitialAmount(), view.getCurrency(), new AsyncCallback<Void>() { @Override public void onFailure(Throwable caught) { } @Override public void onSuccess(Void result) { eventBus.fireEvent(new NewRegistrationSuccessEvent()); } }); } 

在这里,你可以看到,我不想从服务器的任何东西,我要求创build一个新的注册,但public interface AsyncCallback<T> { .... }是一个通用的接口,所以我提供无效,因为generics没有不接受原始types

由于你不能实例化Void,所以你可以使用Apache commons Null对象

 Null aNullObject = ObjectUtils.Null; Null noObjectHere = null; 

在第一行中,你有一个对象,所以aNullObject != null成立,而在第二行没有引用,所以noObjectHere == null成立

要回答海报的原始问题,用法是区分“无”和“无”,这是完全不同的东西。

PS:对空对象模式说“不”

当您不需要Attachment对象时,它也常用于Async-IO完成callback。 在这种情况下,您可以为IO操作指定null并实现CompletionHandler<Integer,Void>

这可能是罕见的情况,但是有一次,我在方面类中使用了Void

这是在具有@Log注释的方法之后运行的一个方面,如果方法返回types不是void,则logging返回的方法和一些信息。

  @AfterReturning(value = "@annotation(log)", returning = "returnValue", argNames = "joinPoint, log, returnValue" ) public void afterReturning(final JoinPoint joinPoint, final Log log, final Object returnValue) { Class<?> returnType = ((MethodSignature) joinPoint.getSignature()) .getReturnType(); if (Void.class.isAssignableFrom (returnType)) ) { //Do some log } }