有人可以告诉我为什么,如下所示,隐式转换在简单地创建KeyVal对象时起作用,但在Map中创建KeyVal的键时不起作用。
谢谢。
object o {
case class KeyVal(i: Int)
object KeyVal {
implicit def strToKeyVal(s:String) = KeyVal(s.toInt)
}
}
import o._
val x : KeyVal = "1" // Works fine to create a KeyVal
val x : Map[KeyVal, String] = Map("1" -> "One") // Type Mismatch: found (String, String), wants (KeyVal, String)
答案 0 :(得分:3)
Scala编译器不是一个全能的东西,它无法解决所有类型的错误。它应该如何将(String, String)
元组转换为(KeyVal, String)
元组,为什么不转换为(String, KeyVal)
或(KeyVal, KeyVal)
。您的隐式转化会将String
转换为KeyVal
,但不会将(String, String)
转换为KeyVal
。如果将此隐式转换添加到协同对象:
implicit def strToKeyVal(s: (String, String)): (KeyVal, String) = (KeyVal(s._1.toInt), s._2)
一切都会正常工作
答案 1 :(得分:3)
这只是时间问题。在考虑Map
的类型时,您不再拥有String
,而是(String, String)
元组。发生这种情况是因为->
是首先应用的运算符,然后为Map
返回其结果。
如果您避免使用该运算符,则可以正常运行:
val x : Map[KeyVal, String] = Map(("1", "One"))