为什么 ExecutorService.submit(Runnable task) 返回 Future<?> 而不是 Future<Void>?

执行器服务具有以下方法:

将来<?>提交(可运行任务)

但是,既然这个方法总是会返回,那么下面的签名不是更合适吗?Futuregetnull

Future<Void> submit(Runnable task)


答案 1

在提交方法实现 void 中使用 Jdk 1.8,而在 jdk1.6 中它是 Object 。我的理解是使用void更合适,这就是为什么它在jdk1.7 / 1.8中更改的原因.仅用于支持不更改它的接口

 public Future<?> submit(Runnable task) {
        if (task == null) throw new NullPointerException();
        RunnableFuture<Void> ftask = newTaskFor(task, null);
        execute(ftask);
        return ftask;
    }

和 JDK 1.6

 public Future<?> submit(Runnable task) {
       if (task == null) throw new NullPointerException();
       RunnableFuture<Object> ftask = newTaskFor(task, null);
       execute(ftask);
        return ftask;
   }

答案 2

请注意,s 方法返回基元而不是类型。因此,不能有一个类型,解决方案是使其成为通配符。请注意,它来自java 1.5,而来自1.0。由于遗留代码的原因,他们不会更改 的返回类型以符合。RunnablerunvoidVoidFutureVoidFutureRunnablerunFuture


推荐