2014-12-30 2 views
1

В Scala люди пишут:Scala в Java

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

и они имеют в виду Par так:

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

, Что эквивалентно type (Scala) в Java?

+5

Их нет. Вы должны повторить полное объявление типа в java, не можете сделать псевдоним (вы можете сделать подтип, большую часть времени он не работает хорошо). –

ответ

4

Это нарекание типа и нет на Java. Хотя вы можете приблизиться к этому примерно так:

abstract class Par<A> extends F<ExecutorService, Future<A>> 

Редактировать: Я согласен с Дидье. Это путь к гибели.

+1

Это далека от приближения. Это совершенно бесполезно. – rightfold

4

Это кэрри функция, которая принимает ExecutorService и возвращает функцию, которая принимает Par<A> и возвращает Future<A>.

Curried функции в Java могут эмулироваться методами, возвращающими объекты. Итак, предположим, что мы имеем 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.

Смежные вопросы