Использование функции 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() }
указывать типы явно