2015-02-27 2 views
14

Я пытаюсь сделать следующийНевозможно преобразовать непорочную java.lang.Void

interface Updater { 
    void update(String value); 
} 

void update(Collection<String> values, Updater updater) { 
    update(values, updater::update, 0); 
} 

void update(Collection<String> values, Function<String, Void> fn, int ignored) { 
    // some code 
} 

, но я получаю эту ошибку компилятора:

"Cannot convert void to java.lang.Void" 

Это означает, что updater::update не может быть использована в качестве Function<String, Void>.

Конечно, я не могу написать Function <String, void>, и я не хочу менять тип возврата update() на Void.

Как решить эту проблему?

ответ

17

Function возвращает значение, даже если он объявлен как тип Void (вы должны вернуть null тогда. В противоположность этому, метод void действительно ничего не возвращает, даже не null. Таким образом, вы должны вставить return заявление:

void update(Collection<String> values, Updater updater) { 
    update(values, s -> { updater.update(); return null; }, 0); 
} 

в качестве альтернативы можно изменить Function<String,Void> к Consumer<String>, то вы можете использовать ссылку метод:

void update(Collection<String> values, Updater updater) { 
    update(values, updater::update, 0); 
} 
void update(Collection<String> values, Consumer<String> fn, int ignored) { 
    // some code 
} 
+0

Спасибо большое, я принимаю это! Постскриптум i обновленный первый пост, метод update() получает String в качестве аргумента, я просто забываю об этом. – Kastaneda

+0

Предупреждение: Java 8. –

+2

@Dmitry Ginzburg: вопрос помечен тегом [tag: java-8], о чем вы хотите предупредить? – Holger

8

Функция возвращает значение. То, что вы ищете, это интерфейс java.util.function.Consumer. Он имеет метод void accept(T) и не возвращает значение.

Таким образом, вы метод становится:

void update(Collection<String> values, Consumer<String> fn, int ignored) { 
    // some code 
} 
Смежные вопросы