【发布时间】:2019-07-11 09:34:16
【问题描述】:
我对 Kotlin 中的 SAM 有疑问。我正在开发一个具有接受 lambda 的函数的库。我的问题是我不能简单地写这个:
fun myFun(someLambda: (A) -> B) {
// ...
}
因为如果 Java 用户想要调用它,他们需要将 Function1 传递给它,这不是很好的 UX。如果我改为创建 SAM:
fun myFun(someSam: Function<A, B>) {
// ...
}
那么这对 Kotlin 用户来说很麻烦。到目前为止,我一直在做的是,我采用了 SAM 方式,并为 Kotlin 用户的所有这些功能添加了一个扩展功能,它只是转换为 SAM 功能:
inline fun <A, B> MyClass.someFun(crossinline fn: (A) -> B) {
return someFun(object : Function<A, B> {
override fun accept(value: A): B {
return fn.invoke(value)
}
})
}
这种方法有很多样板,也很难维护。有没有更好的办法来解决这个问题?
【问题讨论】:
-
为什么不两者兼而有之?让它超载。
-
我两者都用,但它带有很多的样板文件。我正在寻找一种解决方案,它可以让我编写更少且可维护的代码。
-
所以问题是函数调用的SAM转换只发生在从kotlin调用java而不是从kotlin调用kotlin时......为什么这么愚蠢。是否可以向 kotlin 团队请求此功能?
标签: java kotlin kotlin-multiplatform