使用Kotlin函数作为Java SAM类型
从一个期望SAM(单抽象方法)类型参数的Java API调用方法时,是否存在一种将函数文本强制转换为正确类型的一致方法? 我发现有时Kotlin的功能工作得很好,其他人也不是没有看起来一致。
我有几个来自Ratpack API的例子:
当使用Kotlin函数直接调用ChainAction.handler(String, Handler)
可以正常工作,例如:
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
乐趣)。
这是类型投影的一个暂时的问题(Java的? super Foo
被翻译成Kotlin的类型投影)。 将在不久的将来得到修复。
提示:在困难的情况下,您可以使用“SAM适配器”,例如Action<in Foo> { bar() }
来明确指定类型