在 lambda 中使用 Executors.callable()

问题描述

我有以下工作:

var tasks = tasks.stream(a -> (Callable<Set<FinishedTask>>) () -> call(a)).collect(Collectors.toList());

我想把上面的代码改成使用Executors.callable

// how to cast executor.callable?
var tasks = tasks.stream(t -> (Set<FinishedTask>)Executors.callable(()-> call(t))).collect(Collectors.toList());

但是,我收到编译器错误

The method callable(Runnable) is ambiguous for the type Executors

演员阵容有什么问题?

解决方法

这里有两个问题。

首先出现这种类型的错误,java无法推断调用哪个方法。

Callable<?> c = Executors.callable( (PrivilegedAction) () -> "tested" );

通过使用强制转换,您可以告诉 java 使用 Executors.callable(PrivilegedAction) 而不是 Executors.callable(PrivilegedExceptionAction)。它们都具有相同的方法签名。在这种情况下 Runnable 没有错,因为它是一个 void 返回类型。

第二,现在它会知道使用哪个方法,但它仍然返回一个 Callable,所以你不能只是将它转换为一个集合。

Callable<Set<FinishedTask>> callable = () -> call(a);
Callable<Set<FinishedTask>> callable2 = Executors.callable(()-> call(t));

您正在尝试投射到一个集合。你需要打电话。

Set<FinishedTask> sft = Executors.callable(()-> call(t)).call();