【发布时间】:2020-05-10 07:19:44
【问题描述】:
这里有两个函数,一个在kotlin.kt:
interface TraitA
fun <T : TraitA> foo(a: Any, f: (T) -> Unit) {
TODO()
}
Scala.scala中的另一个适配器函数
import KotlinKt.foo
object Scala {
def adapter[E <: TraitA](f: (E) => Unit): Unit = {
foo[E](None, { a =>
// Do something
kotlin.Unit.INSTANCE
})
}
}
直到此刻,它才能编译。但是当我在 Kotlin 中重载这个函数时:
interface TraitA
fun <T : TraitA> foo(f: (T) -> Unit) {
TODO()
}
fun <T : TraitA> foo(a: Any, f: (T) -> Unit) {
TODO()
}
Scala 编译失败,出现以下错误:
> Task :scala:compileScala
[Error] E:\Documents\Projects\Temp\kotlin-example\scala\src\main\scala\Scala.scala:5: missing parameter type
one error found
它告诉我要添加参数类型,所以我添加了它:
import KotlinKt.foo
object Scala {
def adapter[E <: TraitA](f: (E) => Unit): Unit = {
foo[E](None, { (a: E) =>
kotlin.Unit.INSTANCE
})
}
}
修改后编译器抛出其他错误:
[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
我试图“显式地”构造一个 Kotlin Function1:
import KotlinKt.foo
import kotlin.jvm.functions.{Function1 => KF1}
object Scala {
def adapter[E <: TraitA](f: (E) => Unit): Unit = {
val kf: KF1[E, kotlin.Unit] = { e => f(e); kotlin.Unit.INSTANCE }
foo[E](None, kf)
}
}
它可以编译并且运行良好。不过太迂回了,有没有更漂亮的方法可以拨打foo[T](Any, Function1[_ >: T, kotlin.Unit])?
【问题讨论】:
-
什么版本的scala?
-
Gradle 6.1、Kotlin 1.3.72、Scala 2.13.2