Scala在Java中的等效类型

时间:2014-12-30 10:41:05

标签: java scala

在Scala中,人们写道:

type Par[A] = ExecutorService => Future[A]

他们指的是这样的Par

def run[A](s: ExecutorService)(a: Par[A]): Future[A] = a(s)

在Java中等同于type(Scala)?

2 个答案:

答案 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。