从 Scala 函数到 Java 函数的隐式转换

2023-12-28

我想创建从 Scala 函数(可能是匿名)到java.util.function.Function。这是我所拥有的:

import java.util.function.{Function => JavaFunction}
implicit def scalaFunctionToJavaFunction[From, To](function: (From) => To): JavaFunction[From, To] = {
  new java.util.function.Function[From, To] {
    override def apply(input: From): To = function(input)
  }
}

它工作正常,只是当被转换的函数没有显式指定参数类型时类型推断会失败:

val converted: JavaFunction[String, Int] = (s: String) => s.toInt // works fine
val converted2: JavaFunction[String, Int] = scalaFunctionToJavaFunction(s => s.toInt) // works
val converted3: JavaFunction[String, Int] = s => s.toInt // gives compilation error "missing parameter type"

编译器能够推断类型

我的问题是:

  • 为什么Scala编译器在第三种情况下无法推断出参数的类型?
  • 我可以修改隐式转换以便推断类型吗?

我知道一个相关问题 https://stackoverflow.com/q/34356258/2032064这涉及到这个主题,但没有回答我的问题。

顺便说一句,这个问题似乎与 Java 的互操作性无关。如果我更换JavaFunction对于自定义 Scala 特征,行为保持不变。


为什么Scala编译器在第三种情况下无法推断出参数的类型?

要推断 lambda 表达式的参数类型,预期类型必须是String => ?(对于本例)。在converted3,预期类型是JavaFunction[String, Int]。这不是 Scala 函数,因此不起作用。它will在 Scala 2.12 中,或在 2.11 中-Xexperimental标量选项 https://stackoverflow.com/a/22825239/9204。这是根据规格 http://www.scala-lang.org/files/archive/spec/2.11/06-expressions.html#translation:

如果匿名函数的预期类型具有 scala.Functionn[S1,…,Sn, R] 的形状,或者可以通过 SAM 转换为这样的函数类型,则类型 钛 一个参数的 希 可以省略,只要 硅 是在预期类型中定义的,并且 钛 = 硅 假设。此外,类型检查时的预期类型 e 是 R。

如果函数字面量没有预期类型,则必须显式指定所有形式参数类型 Ti,并且 e 的预期类型未定义。

“SAM-converted”部分是由-Xexperimental/2.12 默认情况下在 2.11 中无效。

我可以修改隐式转换以便推断类型吗?

我不相信是这样。你什么can要做的就是改变转换发生的地方:写val unconverted: String => Int = s => s.toInt(要不就val unconverted = (s: String) => s.toInt)并将其传递到哪里JavaFunction[String, Int]是期待。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从 Scala 函数到 Java 函数的隐式转换 的相关文章

随机推荐