java.lang.Void vs void vs Null

时间:2013-03-21 02:05:18

标签: java android null void

Voidvoid之间究竟有什么区别,我可以改用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"

5 个答案:

答案 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.Voidvoid类型的带框表示。由于您不能拥有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比较。