Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/374.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 番石榴如何才能将未来抛给可倾听的未来?_Java_Asynchronous_Guava - Fatal编程技术网

Java 番石榴如何才能将未来抛给可倾听的未来?

Java 番石榴如何才能将未来抛给可倾听的未来?,java,asynchronous,guava,Java,Asynchronous,Guava,探索guava中的类以了解guava带来的好处,尽管现在引入Java8并不重要,但我仍然想知道listenableFuture是如何引入的 在中,有如下代码段: @Override public ListenableFuture<?> submit(Runnable task) { return (ListenableFuture<?>) super.submit(task); } @覆盖 public ListenableFuture提交(可运行任

探索guava中的类以了解guava带来的好处,尽管现在引入Java8并不重要,但我仍然想知道listenableFuture是如何引入的

在中,有如下代码段:

  @Override
  public ListenableFuture<?> submit(Runnable task) {
    return (ListenableFuture<?>) super.submit(task);
  }
@覆盖
public ListenableFuture提交(可运行任务){
返回(ListenableFuture)超级提交(任务);
}

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

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

提供执行服务执行方法的默认实现。 此类实现submit、
invokeAny
invokeAll
方法 使用
newTaskFor
返回的
RunnableFuture
,默认为
FutureTask
此软件包中提供的类

默认值在中被覆盖

抽象
listingExecutorService
创建 提交给的每个
Runnable
Callable
ListenableFuture
实例 它

您还可以在链接到的源代码中看到这一点

  /** @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);
  }
/**@自19.0起(自14.0起返回类型{@code ListenableFutureTask})*/
@凌驾
受保护的最终可运行未来新任务(可运行,T值){
返回TrustedListenableFutureTask.create(runnable,value);
}
create
返回一个值,该值是
ListenableFuture
的子类型

abstractListingExecutorService
中的那些方法被重新声明,以便使它们的返回类型更加具体,即
ListenableFuture


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

只是阅读了模板方法模式,但没有意识到它的应用是这样的,谢谢