gpt4 book ai didi

java - Guava 如何才能将 future 转换到 listenablefuture 呢?

转载 作者:行者123 更新时间:2023-11-29 04:24:09 27 4
gpt4 key购买 nike

探索guava中的类,了解guava带来的好处,虽然随着java 8的引入,现在已经没有那么重要了,但我还是很想知道listenableFuture是怎么引入的。

AbstractListeningExecutorService ,有这样的代码片段:

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

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

最佳答案

您会注意到 AbstractListeningExecutorService 的直接父类(super class)是 AbstractExecutorService哪个

Provides default implementations of ExecutorService execution methods. This class implements the submit, invokeAny and invokeAll methods using a RunnableFuture returned by newTaskFor, which defaults to the FutureTask class provided in this package.

默认值在 AbstractListeningExecutorService 中被覆盖

Abstract ListeningExecutorService implementation that creates ListenableFuture instances for each Runnable and Callable submitted to it

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

  /** @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);
}

create 返回一个 TrustedListenableFutureTask值,它是 ListenableFuture 的子类型。

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

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

关于java - Guava 如何才能将 future 转换到 listenablefuture 呢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47314793/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com