探索番石榴中的类,了解番石榴带来的好处,即使引入java 8,现在也没关系,但我仍然想知道如何引入listenableFuture。
AbstractListeningExecutorService中的,有这样的代码段:
@Override
public ListenableFuture<?> submit(Runnable task) {
return (ListenableFuture<?>) super.submit(task);
}
这里super
表示AbstractListeningExecutorService的超类,即ExecutorService,但是我们怎样才能将超类(Future)强制转换为子类(ListenableFuture)?
答案 0 :(得分:3)
您会注意到AbstractListeningExecutorService
的直接超类是AbstractExecutorService
提供
ExecutorService
执行方法的默认实现。 此类实现提交,invokeAny
和invokeAll
方法 使用RunnableFuture
返回的newTaskFor
,默认为 此包中提供了FutureTask
类。
在AbstractListeningExecutorService
创建的抽象
ListeningExecutorService
实现 提交给每个ListenableFuture
和Runnable
的{{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
类型的实例。因此演员是安全的。