Void
,void
之间究竟有什么区别,我可以改用null
吗?
我问这是因为我正在查看示例Android代码,他们使用了Void但是它上面有Eclipse错误(它显示为Void cannot be resolved to a variable
)。
我破解的代码是
public class MyAsyncTask extends AsyncTask<Void, Void, Boolean>{
...
}
我像这样使用它
MyAsyncTask myAsyncTask = new MyAsyncTask();
myAsyncTask.execute((Void),null);//this is the line that breaks "Void cannot be resolved to a variable"
答案 0 :(得分:48)
Void
最常见的用途是反思,但这不是唯一可以使用的地方。
void
是一个关键字,表示函数不会产生值。
java.lang.Void
是引用类型,然后以下内容有效:
Void nil = null;
(到目前为止它并不有趣......)
作为结果类型(返回值类型为Void
的函数),表示函数*始终*返回null
(它不能返回null
以外的任何内容,因为Void
没有实例)。
Void function(int a, int b) {
//do something
return null;
}
为什么我喜欢总是返回null的函数?
在发明泛型之前,我没有Void
的用例。
使用泛型,有一些有趣的案例。例如,Future<T>
是由其他线程执行的异步操作的结果的持有者。 Future.get
将返回操作值(类型T
),并将阻塞直到执行计算。
但是......如果没有什么可以回来怎么办?简单:使用Future<Void>
。例如,在Google App Engine中,Asyncronous Datastore Service delete
操作返回Future<Void>
。如果在将来调用get()
,则在删除完成后返回 {strong}。可以用Callable s写一个类似的例子。
另一个用例是没有值的null
,即Map
。这样的地图的行为类似于Map<T,Void>
,那么当没有Set<T>
的等效实现时(例如,没有Set
,它可能会有用),然后可以使用{{3} }})。
答案 1 :(得分:4)
Void
是“一个不可实例化的占位符类,用于保存对表示Java关键字void的Class对象的引用。” (来自http://docs.oracle.com/javase/6/docs/api/java/lang/Void.html)
void
是一种表示不返回的返回类型。
null
缺乏价值。
答案 2 :(得分:2)
java.lang.Void
是void
类型的带框表示。由于您不能拥有void
类型的实例,因此它主要用于完整性以及您需要它进行反射的非常罕见的实例。
答案 3 :(得分:2)
您的代码中有一个额外的逗号。
myAsyncTask.execute((Void),null);
//^extra comma right here
此外,无需将null
转换为Void
,因为(1)Void
没有实例,因此没有Void
个对象,并且(2) )将null
转换为任何东西都是无用的,因为null是任何Object数据类型的有效值。
代码应该只是:
myAsyncTask.execute(null);
答案 4 :(得分:1)
void
:java关键字指示方法将不返回任何内容。用于方法
Void
:包装无效。它扩展了Object类。
由于Generic不支持原始数据类型,因此需要。 (不要认为原始是一个复杂的情况,但这只是为了解释)
应该用于反射
Constructor<Void> constructor = Void.class.getConstructor()
null
表示没有值。用于对象,与用于方法的void比较。