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

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

У меня есть пара примеров из 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 заменять второй аргумент. Это связано с тем, что общий тип усложняет жизнь?

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

1 ответ

Решение

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

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

Другие вопросы по тегам