【问题标题】:Calling overloaded method of Kotlin in Scala在Scala中调用Kotlin的重载方法
【发布时间】: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[_ &gt;: T, kotlin.Unit])

【问题讨论】:

  • 什么版本的scala?
  • Gradle 6.1、Kotlin 1.3.72、Scala 2.13.2

标签: scala kotlin


【解决方案1】:

尝试添加隐式转换

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。

【讨论】:

  • 解决了我的问题,谢谢!但是为什么我不能显式地为 foo 提供一个类型参数 'E'?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-11-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多