2010-11-20 53 views
2

我有這個片段的Scala代碼:斯卡拉錯誤:找到列表[字符],要求列表[ScalaObject]

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, ", ") 

下到最後一行編譯罰款,但在最後一行我得到的錯誤

Found List[Char] , required List[ScalaObject]

labeling有型Map[State, Set[Char]]。)

我有點驚訝,因爲1)我認爲List[Char]可以被看作是一個亞型(與Java相對),以及2)最後一行上方的行編譯! (transMap[State, Set[State]]雖然...)

問題很明顯,我做錯了什麼,我該如何解決它?

回答

4

Char不是ScalaObject的子類型。

頂部你有Any其中超級類型的一切。你可以用Any代替ScalaObject,這應該會讓你的代碼編譯。

請參閱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("[", ", ", "]") 
+0

完美,謝謝!並感謝mkString;) – aioobe 2010-11-20 18:37:05