Scala错误:找到列表[Char],必需列表[ScalaObject]

时间:2010-11-20 15:05:11

标签: scala type-mismatch

我有一段Scala代码:

def prologList(l: List[ScalaObject], sep: String) =
    "[" + (if (l isEmpty) "" else l.reduceLeft(_ + sep + _)) + "]"

def neighbors(s: State) = prologList(trans(s).toList, ", ")
def labels(s: State) = prologList(labeling(s).toList, ", ")

倒数第二行编译得很好,但在最后一行我收到错误

  

找到List[Char],必填List[ScalaObject]

labeling的类型为Map[State, Set[Char]]。)

我有点惊讶,因为1)我认为List[Char]可以看作List[ScalaObject]的子类型(而不是Java),2)最后一行上面的行编译! (trans类型Map[State, Set[State]]虽然......)

问题很明显,我做错了什么,我该如何解决?

1 个答案:

答案 0 :(得分:4)

Char不是ScalaObject的子类型。

在顶部你有Any这是一种超级类型的东西。您可以将ScalaObject替换为Any,这样就可以编译代码。

有关类型层次结构图,请参阅http://www.scala-lang.org/node/128

在REPL中,您可以使用隐式函数来解决类型关系问题:

scala> implicitly[Char <:< Any]
res0: <:<[Char,Any] = <function1>

scala> implicitly[Char <:< ScalaObject]
<console>:6: error: could not find implicit value for parameter e: <:<[Char,ScalaObject]
       implicitly[Char <:< ScalaObject]
                 ^

scala> implicitly[List[Char] <:< List[Any]]
res2: <:<[List[Char],List[Any]] = <function1>

scala> implicitly[List[Char] <:< List[ScalaObject]]
<console>:6: error: could not find implicit value for parameter e: <:<[List[Char],List[ScalaObject]]
       implicitly[List[Char] <:< List[ScalaObject]]

编辑:那么,你知道mkString吗?

trans(s).mkString("[", ", ", "]")