Ich habe den folgenden Code,scala Karte Methode kann nicht richtig Funktionstyp in der Sammlung mit festen Funktionstypen löst
def obsKPI[T](kpi: Option[T], f: T => Unit) = {
kpi match {
case Some(obsValue) => f(obsValue)
case _ => Unit
}
}
def func1(str:String):Unit = println(str)
def func2(num: Int):Unit = println(num)
//option1: val inputArgs = List((Some("first"),(func1 _)),(Some("third"), (func1 _)))
//option2: val inputArgs = List((Some(456), (func2 _)),(None,(func2 _)))
// option3:
val inputArgs = List((Some("first"),(func1 _)),(Some(456), (func2 _)),(Some("third"), (func1 _)),(None,(func2 _)))
inputArgs.map(x => obsKPI(x._1, x._2))
, wenn entweder die Option 1 oder 2 ausgeführt wird (die inputArgs Listenfunktion von nur String enthält => Einheit oder Int => Unit), funktioniert der Code, aber wenn die Option läuft 3, erhalte ich eine Fehlermeldung:
:68: error: type mismatch;
found : Int with String => Unit
required: Any => Unit
inputArgs.map(x => obsKPI(x._1, x._2))
^
Danke, dass ich weiß, was hier schief gelaufen ist.
Nach dem Quellcode "endgültige abstrakte Klasse Int private erweitert AnyVal". AnyVal ist wieder Erweiterung von Any. Atleast tis sollte funktionieren, wenn ich out def func1 (str: String) auskommentieren? – BDR
'Int' ist eine Unterklasse von' Any', ja. Aber 'Int => Unit' ist _nicht_ eine Unterklasse von' Any => Unit' Wenn Sie 'func1' entfernen und' func2' nur überall lassen, wird das funktionieren, weil 'inputArgs' eine' List [Int, Int => Unit] ', so wird der' T' in 'obsKPI' Aufruf auf' Int' anstatt auf 'Any' aufgelöst. – Dima
ja es macht sens – BDR