问题描述
我有以下工作:
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();