1

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

2 回答 2

3

Scala 编译器不是万能的东西,它不能解决所有类型的类型错误。它应该如何将(String, String)tuple 转换为(KeyVal, String)tuple 以及为什么不转换为(String, KeyVal)or (KeyVal, KeyVal)。您的隐式转换转换StringKeyVal,但不是转换(String, String)KeyVal。如果将此隐式转换添加到伴随对象:

implicit def strToKeyVal(s: (String, String)): (KeyVal, String) = (KeyVal(s._1.toInt), s._2)

一切都会好起来的

于 2013-07-03T19:01:40.540 回答
3

这只是时间问题。在考虑 的类型时Map,您不再拥有String,而是拥有一个(String, String)元组。发生这种情况是因为->是先应用的运算符,然后返回其结果为Map.

如果您避免使用该运算符,它可以工作:

val x : Map[KeyVal, String] = Map(("1", "One"))
于 2013-07-03T21:12:48.947 回答