Java 番石榴如何才能将未来抛给可倾听的未来?
探索guava中的类以了解guava带来的好处,尽管现在引入Java8并不重要,但我仍然想知道listenableFuture是如何引入的 在中,有如下代码段:Java 番石榴如何才能将未来抛给可倾听的未来?,java,asynchronous,guava,Java,Asynchronous,Guava,探索guava中的类以了解guava带来的好处,尽管现在引入Java8并不重要,但我仍然想知道listenableFuture是如何引入的 在中,有如下代码段: @Override public ListenableFuture<?> submit(Runnable task) { return (ListenableFuture<?>) super.submit(task); } @覆盖 public 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
类型的实例。因此演员是安全的 只是阅读了模板方法模式,但没有意识到它的应用是这样的,谢谢