用于Java Void引用类型?

用于Java Void引用类型?,java,void,Java,Void,有一个JavaVoid--大写字母V--。我见过它使用的唯一情况是参数化Callables final Callable<Void> callable = new Callable<Void>() { public Void call() { foobar(); return null; } }; final Callable Callable

有一个Java
Void
--大写字母V--。我见过它使用的唯一情况是参数化
Callable
s

final Callable<Void> callable = new Callable<Void>() {
            public Void call() {
                foobar();
                return null;
            }
        };
final Callable Callable=new Callable(){
公开作废通知(){
foobar();
返回null;
}
};
Java
Void
引用类型还有其他用途吗?除了
null
,它还能被分配其他任何内容吗?如果有,你有例子吗?

就像魅力一样

如果有,我会说除了
null
之外,不能给它赋值。我只将其用作“我不需要使用此通用参数”的占位符,如您的示例所示

它也可以用于反射,正如它所说:

Void类是一个不可实例化的占位符类,用于保存对表示Java关键字Void的类对象的引用


Void
已成为您不感兴趣的通用参数的惯例。没有理由使用任何其他非实例化类型,例如
System

例如,它也经常用于
Map
值(尽管
集合。newSetFromMap
使用
布尔值,因为映射不必接受
null
值)和
java.security.PrivilegedAction


几年前,我在
Void
上写了一篇文章。

您可以使用反射创建Void实例,但它们对任何事情都没有用处。Void是一种表示泛型方法不返回任何内容的方法

Constructor<Void> constructor = Void.class.getDeclaredConstructor();
constructor.setAccessible(true);
Void v = constructor.newInstance();
System.out.println("I have a " + v);

所有原语包装类(
Integer
Byte
Boolean
Double
等)在静态
类型
字段中包含对相应原语类的引用,例如:

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
类型进行操作


顺便说一句,上次我尝试它时,没有识别出
void.class
,因此您必须在那里使用
void.TYPE

在泛型之前,它是为反射API创建的,用于保存void方法的Method.getReturnType()返回的类型,对应于其他基元类型类


编辑:来自Void的JavaDoc:“Void类是一个不可实例化的占位符类,用于保存对表示Java关键字Void的类对象的引用”。在泛型之前,我知道除了反射之外没有其他用途。

Void
被创建来包装它的原语
Void
类型。每个基元类型都有其相应的引用类型
Void
用于实例化泛型类或泛型方法的使用,这是一个您不感兴趣的泛型参数。这里有一个例子

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());
      }
    });
  } 
public void onnerRegistration(){
newRegistrationService.createNewUser(view.getUsername(),view.getPassword(),
view.getInitialAmount()、view.getCurrency()、new AsyncCallback(){
@凌驾
失败时的公共无效(可丢弃){
}
@凌驾
成功时公开作废(作废结果){
fireEvent(NewRegistrationSuccessEvent());
}
});
} 
在这里,正如您所看到的,我不希望从服务器获得任何我要求创建新注册的内容,但是
公共接口AsyncCallback{…}
是一个通用接口,因此,我提供了
Void
,因为泛型在您使用时不接受基元类型

,当您希望确保返回值为null时,使用Void而不是Object会更干净

范例

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

   OUT visit(Leaf2 leaf);
}
公共接口离开visitor
{
外访(leaf 1 leaf);
外访(leaf 2 leaf);
}
当您要实现访问者时,可以显式地设置为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;
    }
}
公共类MyVoidVisitor实现了LeavesVisitor
{
无效访问(第1页){
//…在你的叶子上做你想做的事
返回null;
}
无效访问(第2页){
//…在你的叶子上做你想做的事
返回null;
}
}

当您不需要
附件时,它也通常用于异步IO完成回调。在这种情况下,您可以为IO操作指定null,并实现
CompletionHandler

,因为您不能实例化Void,所以可以使用

在第一行中,您有一个对象,因此
anulobject!=null
保持不变,而在第二行中没有引用,因此
noObjectHere==null
保持不变

为了回答海报的原始问题,这个用法是区分“无”和“无”,它们是完全不同的东西


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

这种情况可能很少见,但有一次,我在方面类中使用了
Void

这是一个方面,它在具有
@Log
注释的方法之后运行,并记录返回的方法和一些信息(如果方法返回类型不是void)

 @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
         }
}
@AfterReturning(value=“@annotation(log)”,
returning=“returnValue”,
argNames=“连接点、日志、返回值”
)
返回后的公共无效(最终接合点接合点、最终日志、,
最终对象返回值){
类returnType=((MethodSignature)joinPoint.getSignature())
.getReturnType();
if(Void.class.isAssignableFrom(returnType))){
//做些日志
}
}

+1,用于实例化文档中表示不可实例化的类。我也这么做过,我同意实例化的Void是无用的;
Null aNullObject = ObjectUtils.Null;
Null noObjectHere = null;
 @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
         }
}