2016-01-08 2 views
2

Пусть это:неоднозначность функциональный интерфейс в лямбда

ExecutorService service = ...; 

// somewhere in the code the executorService is used this way: 
service.submit(() -> { ... }); 

лямбда-выражения по умолчанию будет Callable.
Есть ли способ сделать его экземпляр Runnable вместо этого?

Благодарим за помощь.

+0

Вы можете определить его выше как экземпляр runnable –

+0

Конечно, но как это сделать с лямбдами? – pr0gma

ответ

5

Вы можете объявить его как Runnable, или использовать слепок:

Runnable r =() -> { ... }; 
executorService.submit(r); 

или

executorService.submit((Runnable)() -> { ... }); 
+0

В более общем плане, этот ответ сводится к: укажите тип _target_ для лямбда. Контексты назначения, приведения в действие и методы являются некоторыми из способов предоставления целевого типа. –

3

Ваше помещение неправильно. Этот вызов по умолчанию не равен Callable. Выбор осуществляется с помощью формы лямбда-выражения, т.е. возвращает ли он значение:

ExecutorService service = null; 

// somewhere in the code the executorService is used this way: 

// invokes submit(Runnable) 
service.submit(() -> { }); 
// invokes submit(Runnable) 
service.submit(() -> { return; }); 
// invokes submit(Callable) 
service.submit(() -> "foo"); 
// invokes submit(Callable) 
service.submit(() -> { return "foo"; }); 

// in case you really need disambiguation: invokes submit(Runnable,null) 
service.submit(() -> { throw new RuntimeException(); }, null); 
// dito (ignoring the returned value) 
service.submit(this::toString, null); 

Обратите внимание, что если вам не нужно возвращаемый Future, вы можете просто использовать execute(Runnable) непосредственно Ставить на Runnable, а чем его обертывание в FutureTask.

0

Разница между Callable и Runnable с точки зрения их подписи является то, что Callable возвращается значение, в то время как Runnable нет.

Таким образом, () -> { } является Runnable, в то время как, например, () -> "" - Callable.

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