使用Kotlin函数作为Java SAM类型

时间:2014-08-04 13:29:52

标签: kotlin java-interop

从Java API调用期望SAM(单个抽象方法)类型参数的方法是否有一致的方法将函数文字强制转换为正确的类型?我发现有时候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有趣{ {1}})。

1 个答案:

答案 0 :(得分:1)

这是类型投影的临时问题(Java的? super Foo被转换为Kotlin中的类型投影)。将在不久的将来修复。

提示:在困难的情况下,您可以使用“SAM适配器”,例如Action<in Foo> { bar() }明确指定类型