Vone类型的对象与Java泛型中的无界通配符类型有什么区别?我的意思是我理解<?>的使用,以及在反射方面使用Void,但当我看到Java源代码时,我有点好奇
java.util.concurrent.AbstractExecutorService
Run Code Online (Sandbox Code Playgroud)
和它的方法
public Future<?> submit(Runnable task) {
...
RunnableFuture<Void> ftask = new TaskFor(task, null);
...
return ftask;
Run Code Online (Sandbox Code Playgroud)
在方法内部,它使用RunnableFuture <Void>而不是RunnableFuture <?>
有人能帮我理解这背后的原因吗?谢谢
rol*_*lve 14
Void是一个特殊的类,用于表示没有返回值.虽然Void 本身并没有什么特别之处,但它不能(并且永远不会)实例化,因此唯一可能的值是它null.它用于两件事:
voidJava反射中的返回类型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;
}
Run Code Online (Sandbox Code Playgroud)
和JDK 7:
public Future<?> submit(Runnable task) {
if (task == null) throw new NullPointerException();
RunnableFuture<Void> ftask = newTaskFor(task, null);
execute(ftask);
return ftask;
}
Run Code Online (Sandbox Code Playgroud)
如您所见,类型Void仅在JDK 7中更改,可能是因为它在概念上更有意义.但是,由于该方法的接口不能改变(由于兼容性的原因,并因为方法实现Future<?> submit(Runnable task)的的ExecutorService的接口),返回类型Future<?>保持不变.这是我的解释.