Ich möchte eine implizite Konvertierung von einer Scala-Funktion (möglicherweise anonym) zu java.util.function.Function
erstellen. Hier ist, was ich habe:Implizite Konvertierung von Scala-Funktion in Java-Funktion
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)
}
}
Es funktioniert gut, außer dass die Typinferenz versagt, wenn die Funktion umgewandelt werden nicht Parametertyp explizit angeben:
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"
Der Compiler ist in der Lage, den Typ zu schließen,
Meine Fragen sind:
- Warum kann der Scala-Compiler im dritten Fall nicht den Typ des Parameters ableiten?
- Kann ich die implizite Konvertierung so ändern, dass der Typ abgeleitet wird?
Ich kenne eine related question, die auf dieses Thema berührt, aber keine Antwort auf meine Fragen gibt.
Das Problem scheint nicht im Zusammenhang mit der Interoperabilität mit Java, BTW. Wenn ich JavaFunction
durch eine benutzerdefinierte Scala-Eigenschaft ersetze, bleibt das Verhalten gleich.
A [verwandten Artikel] (http://www.tikalk.com/incubator/simulating-sam-closures-scala/) Ich fand. Es liefert keine Antwort, sondern berührt das verwandte Thema der impliziten Konvertierung der Scala-Funktion. – Mifeet