Как объявить параметр функции для приема функций, которые вы выбрали?

Я определил функцию в Котлине:

fun convertExceptionToEmpty(requestFunc: () -> List<Widget>): Stream<Widget> { try { return requestFunc().stream() } catch (th: Throwable) { // Log the exception... return Stream.empty() } } 

Я определил метод Java с этой сигнатурой:

 List<Widget> getStaticWidgets() throws IOException; 

Я пытаюсь составить их так:

 Stream<Widget> widgets = convertExceptionToEmpty(() -> getStaticWidgets()) 

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

Ошибка: (ln, col) java: незарегистрированное исключение java.io.IOException; должны быть пойманы или объявлены брошенными

Как определить параметры моей функции для принятия функции, которая выбрасывает?

Проблема в том, что Java проверила исключения, но Котлин этого не делает. Тип параметра requestFunc () -> List<Widget> будет отображаться в функциональный интерфейс Function0 <List <Widget >>, но вызов оператора не выдает проверенное исключение в коде Kotlin.

Таким образом, вы не можете вызвать getStaticWidgets() в выражении лямбда, поскольку он getStaticWidgets() исключение IOException которое является проверенным исключением в Java.

Поскольку вы контролируете код Kotlin и Java, самым простым решением является изменение типа параметра () -> List<Widget> на Callable<List<Widget>> , например:

 // change the parameter type to `Callable` ---v fun convertExceptionToEmpty(requestFunc: Callable<List<Widget>>): Stream<Widget> { try { // v--- get the `List<Widget>` from `Callable` return requestFunc.call().stream() } catch (th: Throwable) { return Stream.empty() } } 

Затем вы можете использовать ссылочное выражение метода в Java8, например:

 Stream<Widget> widgets = convertExceptionToEmpty(this::getStaticWidgets); //OR if `getStaticWidgets` is static `T` is the class belong to // v Stream<Widget> widgets = convertExceptionToEmpty(T::getStaticWidgets); 

Я боюсь, что вы ничего не можете сделать, но поймать это исключение:

  Stream<Integer> widgets = convertExceptionToEmpty(() -> { try { return getStaticWidgets(); } catch (IOException e) { e.printStackTrace(); } return null; }); 
Intereting Posts
Statusbar не прозрачен, но белый Firebase: повторная проверка подлинности Google Auth ERROR (недопустимый id_token в IdP) Объединение Java с Kotlin в Android Объявление байта в Kotlin делает ошибку времени компиляции «Целочисленный литерал не соответствует ожидаемому типу Byte» Функции расширения Котлина и функции-члены? Ожидается ли, что я могу вызвать функцию с объектом-приемником, передав объект-приемник в качестве первого аргумента? Kotlin: Передача реализации интерфейса в качестве параметра Формат в шаблонах строк kotlin Как долго свойство String может находиться в Котлине? Как использовать с оберткамиDefault? как интегрировать kotlin с node.js Как обрабатывать обработку ошибок в одном месте в rxjava с помощью обертки Разработка лямбда-выражения Если isConnected возвращает true, почему Exeption говорит, что он не подключен? Как создать кеширование / горячую версию rx.Single?