Guava如何才能将未来推向可听的未来?

时间:2017-11-15 18:32:38

标签: java asynchronous guava

探索番石榴中的类,了解番石榴带来的好处,即使引入java 8,现在也没关系,但我仍然想知道如何引入listenableFuture。

AbstractListeningExecutorService中的

,有这样的代码段:

  @Override
  public ListenableFuture<?> submit(Runnable task) {
    return (ListenableFuture<?>) super.submit(task);
  }

这里super表示AbstractListeningExecutorService的超类,即ExecutorService,但是我们怎样才能将超类(Future)强制转换为子类(ListenableFuture)?

1 个答案:

答案 0 :(得分:3)

您会注意到AbstractListeningExecutorService的直接超类是AbstractExecutorService

  

提供ExecutorService执行方法的默认实现。   此类实现提交,invokeAnyinvokeAll方法   使用RunnableFuture返回的newTaskFor,默认为   此包中提供了FutureTask类。

AbstractListeningExecutorService

中覆盖该默认值
  

创建的抽象ListeningExecutorService实现   提交给每个ListenableFutureRunnable的{​​{1}}个实例   它

您还可以在链接到

的源代码中看到它
Callable

/** @since 19.0 (present with return type {@code ListenableFutureTask} since 14.0) */ @Override protected final <T> RunnableFuture<T> newTaskFor(Runnable runnable, T value) { return TrustedListenableFutureTask.create(runnable, value); } 返回TrustedListenableFutureTask值,该值是create的子类型。

ListenableFuture中的那些方法被重新声明,以便可以使其返回类型更具体,即。 AbstractListeningExecutorService

由于ListenableFuture的返回类型为super.submit(..),因此必须将返回值强制转换为适当的子类型,即。在这种情况下Future。并且由于所有调用都返回由ListenableFuture创建的实例,因此已知它们将是newTaskFor类型的实例。因此演员是安全的。