void是一个特殊的类,用来表示没有返回值。Void
虽然本身没有什么特别之处,但它不能(也永远不会)被实例化,所以它唯一可能的值是 always null
。它用于两件事:
- 说泛型方法或类没有返回值。
- 使用 .来表示
void
Java 反射中的返回类型Void.TYPE
。例如,请参阅如何通过反射确定方法是否返回“void”。
所以它与通配符非常不同,通配符不是实际的类,而是在编译时代表一种特定的、未知的类型。在运行时,它像所有其他泛型类型一样被擦除。
关于submit
方法。以下是 JDK 6 的两个实现:
public Future<?> submit(Runnable task) {
if (task == null) throw new NullPointerException();
RunnableFuture<Object> ftask = newTaskFor(task, null);
execute(ftask);
return ftask;
}
和 JDK 7:
public Future<?> submit(Runnable task) {
if (task == null) throw new NullPointerException();
RunnableFuture<Void> ftask = newTaskFor(task, null);
execute(ftask);
return ftask;
}
如您所见,该类型Void
仅在 JDK 7 中更改为,可能是因为它在概念上更有意义。但是由于方法的接口不能改变(出于兼容性原因,并且因为方法实现Future<?> submit(Runnable task)
了ExecutorService接口),所以返回类型Future<?>
保持不变。这就是我的解释。