gpt4 book ai didi

scala - 在Scala中调用Kotlin的重载方法

转载 作者:行者123 更新时间:2023-12-02 11:51:53 26 4
gpt4 key购买 nike

这里有两个函数,一个在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]) ?

最佳答案

尝试添加隐式转换

implicit def scalaToKotlin(u: Unit): kotlin.Unit = kotlin.Unit.INSTANCE

然后
def adapter[E <: TraitA](f: (E) => Unit): Unit = {
foo(None, (e: E) => f(e))
}

编译。

Scala 2.13.2、Kotlin 1.3.50、sbt 1.3.8 + kotlin-plugin 2.0.0。

关于scala - 在Scala中调用Kotlin的重载方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61702209/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com