使用scala地图键的含义

时间:2013-07-03 18:35:58

标签: scala implicit scala-2.10

有人可以告诉我为什么,如下所示,隐式转换在简单地创建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)

2 个答案:

答案 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"))