20

Void, void, 和 can I just use之间到底有什么区别null

我问这是因为我正在查看他们使用 Void 但 Eclipse 错误的示例 Android 代码(它说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"
4

5 回答 5

58

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

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

java.lang.Void是引用类型,则以下内容有效:

 Void nil = null;

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

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

 Void function(int a, int b) {
    //do something
    return null;
 }

为什么我想要一个总是返回 null 的函数?

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

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

但是……万一没有东西可以归还呢?很简单:使用Future<Void>. 例如,在 Google App Engine 中,异步数据存储服务delete操作返回一个Future<Void>. 在get()该未来调用时,在删除完成null返回。可以用Callable写一个类似的例子。

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

于 2013-03-21T02:13:40.510 回答
4

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

void是一个返回类型,表示不返回。

null是价值的缺失。

于 2013-03-21T02:08:45.750 回答
3

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

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

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

代码应该只是:

myAsyncTask.execute(null);
于 2013-03-21T02:24:37.547 回答
2

java.lang.Void是该void类型的盒装表示。由于您不能拥有 type 的实例void,因此它主要是为了完整性,而您需要它进行反射的非常罕见的实例。

于 2013-03-21T02:09:26.223 回答
1

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

Void: 包裹着空隙。它扩展了对象类。

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

应该用于反射

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

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

于 2020-04-01T10:29:40.170 回答