java.lang.Void vs void vs Null

Jos*_*osh 16 java null android void

究竟是什么区别Void,void和我可以只使用null呢?

我问这是因为我正在查看示例Android代码,他们使用Void但是它上面有Eclipse错误(它说Void cannot be resolved to a variable).

我破解的代码是

public class MyAsyncTask extends AsyncTask<Void, Void, Boolean>{
    ...
}
Run Code Online (Sandbox Code Playgroud)

我这样用它

MyAsyncTask myAsyncTask = new MyAsyncTask();
myAsyncTask.execute((Void),null);//this is the line that breaks  "Void cannot be resolved to a variable"
Run Code Online (Sandbox Code Playgroud)

Jav*_*ier 53

最常见的用途Void是用于反射,但这不是唯一可以使用它的地方.

void 是一个关键字,表示函数不会产生值.

java.lang.Void 是一个引用类型,然后以下是有效的:

 Void nil = null;
Run Code Online (Sandbox Code Playgroud)

(到目前为止它并不有趣......)

作为结果类型(具有类型的返回值Void的函数),这意味着函数*总是*返回null(它不能返回除了之外的任何内容null,因为Void没有实例).

 Void function(int a, int b) {
    //do something
    return null;
 }
Run Code Online (Sandbox Code Playgroud)

为什么我喜欢一个总是返回null 的函数?

在发明泛型之前,我没有用例Void.

有了泛型,有一些有趣的案例.例如,a Future<T>是由其他线程执行的异步操作的结果的持有者.Future.get将返回操作值(类型T),并将阻塞直到执行计算.

但是......如果没有什么可以回来怎么办?简单:用一个Future<Void>.例如,在Google App Engine中,Asyncronous Datastore Service delete操作返回a Future<Void>.如果get()在未来被调用时,null返回的删除完成.人们可以用Callable s 写一个类似的例子.

另一个用例是Map没有值,即a Map<T,Void>.这样的映射表现得像a Set<T>,那么当没有等效的实现时Set(例如,没有WeakHashSet,那么可以使用a WeakHashMap<T,Void>)它可能是有用的.


jed*_*dan 3

您的代码中多了一个逗号。

myAsyncTask.execute((Void),null);
                        //^extra comma right here
Run Code Online (Sandbox Code Playgroud)

另外,不需要强制转换nullVoid,因为 (1)Void没有实例,因此没有Void对象,并且 (2) 强制转换null为任何内容都是毫无用处的,因为 null 是任何对象数据类型的有效值。

代码可能应该是:

myAsyncTask.execute(null);
Run Code Online (Sandbox Code Playgroud)

  • 在这种情况下,最安全的选择实际上是“myAsyncTask.execute();” (2认同)