Intereting Posts
Как запросить тип данных Firebase Firestore Reference? Android studio3.0 kotlin classNotFoundException Как я могу создать «forEach», который возвращает объект, который является приемником для функции потребления? Android: реорганизовать множество групп переключателей в одном действии Как создать класс данных реализует специальные UserDetails Spring Secuirty Котлин эквивалентен Groovy spead-dot (*.) Список, содержащий значения NULL, в NULL-список в Kotlin Почему переменная не может быть правильно инициализирована в встроенной функции, как в java? Статические методы и переменные Котлина Котлин объединяет два изменяемых значения с возможностью смены имени Kotlin и parallelStream toArray Как десериализовать унаследованные классы данных Kotlin с помощью Gson Tornadofx – управление объектом таблицы tableview во время сборки Как издеваться над объектом Котлина с помощью Mockito / PowerMockito? Загрузка и установка APK с использованием волейбола

Использование функции Kotlin как типа Java SAM

При вызове методов из Java API, которые ожидают аргументы типа SAM (один абстрактный метод), существует последовательный способ принудительного использования литерала функции для правильного типа? Я нахожу, что иногда функции Котлина работают отлично, а другие не без какой-либо кажущейся последовательности.

У меня есть несколько примеров из API Ratpack:

При вызове ChainAction.handler(String, Handler) с использованием литерала функции Kotlin отлично работает, например:

 handler("foo") { context -> context!!.render("from the foo handler") } 

Вывод типа выбирает этот context как ratpack.handling.Context? правильно.

С другой стороны, я пытаюсь вызвать Guice.handler(LaunchConfig, Action<? super ModuleRegistry>, Action<? super Chain>) и не может понять, как заставить функцию Kotlin встать на второй аргумент. Разве это связано с типичным типом, делающим жизнь трудной?

Возможно, я ожидаю, что Котлин сделает что-то, для чего он не предназначен, но первый пример показывает, что возможно хотя бы некоторое принуждение типа SAM (удовольствие от Kotlin для Ratpack Handler ).

Это временная проблема с проекциями типов (Java- ? super Foo переводится в проекцию типа в Котлине). Будет исправлено в ближайшем будущем.

Совет. В сложных случаях вы можете использовать «адаптеры SAM», например Action<in Foo> { bar() } чтобы явно указать типы