这里有两个函数,一个在kotlin.kt:
interface TraitA
fun <T : TraitA> foo(a: Any, f: (T) -> Unit) {
TODO()
}
Run Code Online (Sandbox Code Playgroud)
另一个适配器函数 Scala.scala
import KotlinKt.foo
object Scala {
def adapter[E <: TraitA](f: (E) => Unit): Unit = {
foo[E](None, { a =>
// Do something
kotlin.Unit.INSTANCE
})
}
}
Run Code Online (Sandbox Code Playgroud)
直到这一刻,它编译。但是当我在 Kotlin 中重载这个函数时:
interface TraitA
fun <T : TraitA> foo(f: (T) -> Unit) {
TODO()
}
fun <T : TraitA> foo(a: Any, f: (T) -> Unit) {
TODO()
}
Run Code Online (Sandbox Code Playgroud)
Scala 无法编译并出现以下错误:
> Task :scala:compileScala
[Error] E:\Documents\Projects\Temp\kotlin-example\scala\src\main\scala\Scala.scala:5: missing parameter type
one error found
Run Code Online (Sandbox Code Playgroud)
它告诉我添加参数类型,所以我添加了它:
> Task :scala:compileScala
[Error] E:\Documents\Projects\Temp\kotlin-example\scala\src\main\scala\Scala.scala:5: missing parameter type
one error found
Run Code Online (Sandbox Code Playgroud)
更改后编译器抛出其他错误:
[Error] E:\Documents\Projects\Temp\kotlin-example\scala\src\main\scala\Scala.scala:5: overloaded method foo with alternatives:
(x$1: Object,x$2: kotlin.jvm.functions.Function1[_ >: E, kotlin.Unit])Unit <and>
(x$1: kotlin.jvm.functions.Function1[_ >: E, kotlin.Unit])Unit
cannot be applied to (None.type, E => kotlin.Unit)
one error found
Run Code Online (Sandbox Code Playgroud)
我试图Function1“明确地”构建一个 Kotlin :
import KotlinKt.foo
object Scala {
def adapter[E <: TraitA](f: (E) => Unit): Unit = {
foo[E](None, { (a: E) =>
kotlin.Unit.INSTANCE
})
}
}
Run Code Online (Sandbox Code Playgroud)
它编译并运行良好。但是太绕了,有没有更漂亮的调用方式foo[T](Any, Function1[_ >: T, kotlin.Unit])?
尝试添加隐式转换
implicit def scalaToKotlin(u: Unit): kotlin.Unit = kotlin.Unit.INSTANCE
Run Code Online (Sandbox Code Playgroud)
然后
def adapter[E <: TraitA](f: (E) => Unit): Unit = {
foo(None, (e: E) => f(e))
}
Run Code Online (Sandbox Code Playgroud)
编译。
Scala 2.13.2、Kotlin 1.3.50、sbt 1.3.8 + kotlin 插件 2.0.0。
| 归档时间: |
|
| 查看次数: |
142 次 |
| 最近记录: |