在Scala中,人们写道:
type Par[A] = ExecutorService => Future[A]
他们指的是这样的Par
:
def run[A](s: ExecutorService)(a: Par[A]): Future[A] = a(s)
在Java中等同于type
(Scala)?
答案 0 :(得分:4)
这称为类型别名,在Java中不存在。虽然您可能会用以下内容来表示:
abstract class Par<A> extends F<ExecutorService, Future<A>>
编辑:我同意迪迪埃的观点。这是毁灭之路。
答案 1 :(得分:4)
这是一个curried函数,它接受ExecutorService
并返回一个带Par<A>
并返回Future<A>
的函数。
Java中的Curried函数可以通过返回对象的方法进行模拟。所以,假设我们有一个interface
:
@FunctionalInterface
interface Par<A> {
Future<A> apply(ExecutorService ex);
}
我们无法将Function<ExecutorService, Future<A>>
替换为interface Par
,但您可以扩展interface
:
@FunctionalInterface
interface Par<A> extends Function<ExecutorService, Future<A>> {
}
过多无关紧要 - Java不支持类型别名,有几种解决方法,有些比其他更糟糕。
我们需要Object
关闭ExecutorService
并返回Function<Par<A>, Future<A>>
<A> Function<Par<A>, Future<A>> withExecutor(ExecutorService s) {
return a -> a.apply(s);
}
所以使用withExecutor
实例调用ExecutorService
会给你一个Function<Par<A>, Future<A>>
,现在要执行一个Par
并获得一个我们称之为函数的未来:
final ExecutorService s = ...
final Function<Par<A>, Future<A>> run = withExecutor(s);
final Par<A> par = ...
final Future<A> f = run.apply(par);
注意,这假设是Java 8。