繁体   English   中英

java.lang.Void vs void vs Null

[英]java.lang.Void vs void vs Null

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"

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 中,异步数据存储服务delete操作返回Future<Void> 当在那个未来调用get()时,删除完成返回null 可以用Callable写一个类似的例子。

另一个用例是没有值的Map ,即Map<T,Void> 这种映射的行为类似于Set<T> ,那么当没有等效的Set实现时它可能很有用(例如,没有WeakHashSet ,那么可以使用WeakHashMap<T,Void> )。

Void是“一个不可实例化的占位符类,用于保存对代表 Java 关键字 void 的 Class 对象的引用。” (来自http://docs.oracle.com/javase/6/docs/api/java/lang/Void.html

void是表示不返回的返回类型。

null是值的缺失。

您的代码中有一个额外的逗号。

myAsyncTask.execute((Void),null);
                        //^extra comma right here

此外,没有必要将null强制转换为Void ,因为 (1) Void没有实例,因此没有Void对象,并且 (2) 将null强制转换为任何东西都是无用的,因为 null 是任何 Object 数据类型的有效值.

代码应该是:

myAsyncTask.execute(null);

java.lang.Voidvoid类型的装箱表示。 由于您不能拥有类型为void的实例,因此它主要用于完整性和非常罕见的实例,您需要它进行反射。

void : java 关键字表示方法不会返回任何内容。 用于方法

Void :环绕空。 它扩展了 Object 类。

需要,因为 Generic 不支持原始数据类型。 (void 被认为是一个复杂的情况,但这只是为了解释)

应该用于反射

Constructor<Void> constructor = Void.class.getConstructor()

null表示没有值。 用于对象,与用于方法的 void 进行比较。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM