[英]java.lang.Void vs void vs Null
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"
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.Void
是void
类型的装箱表示。 由于您不能拥有类型为void
的实例,因此它主要用于完整性和非常罕见的实例,您需要它进行反射。
void
: java 关键字表示方法不会返回任何内容。 用于方法
Void
:环绕空。 它扩展了 Object 类。
需要,因为 Generic 不支持原始数据类型。 (void 被认为是一个复杂的情况,但这只是为了解释)
应该用于反射
Constructor<Void> constructor = Void.class.getConstructor()
null
表示没有值。 用于对象,与用于方法的 void 进行比较。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.