用于Java Void引用类型?
有一个Java用于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
Void
--大写字母V--。我见过它使用的唯一情况是参数化Callable
s
final Callable<Void> callable = new Callable<Void>() {
public Void call() {
foobar();
return null;
}
};
final Callable Callable=new Callable(){
公开作废通知(){
foobar();
返回null;
}
};
JavaVoid
引用类型还有其他用途吗?除了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
}
}