1
我有以下代碼,階映射方法不能正確地解析功能類型中收集與固定功能類型
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))
運行任一選項1或2時(在inputArgs列表僅包含字符串的功能=>單位或INT =>單元),代碼工作,但運行選項3時,我得到一個錯誤:
:68: error: type mismatch;
found : Int with String => Unit
required: Any => Unit
inputArgs.map(x => obsKPI(x._1, x._2))
^
謝謝你讓我知道什麼地方出了問題在這裏。
根據源代碼「final abstract class Int private extends AnyVal」。 AnyVal再次延伸Any。至少我應該正常工作,如果我註釋掉def func1(str:String)? – BDR
'Int'是'Any'的一個子類,是的。但是'Int => Unit''不是'Any => Unit'的子類 如果你刪除了'func1',並且只在所有地方留下'func2',那麼這將起作用,因爲'inputArgs'將會是'List [Int, Int => Unit]',所以'obsKPI'調用中的'T'將會解析爲'Int'而不是'Any' – Dima
yes yes使敏感 – BDR