Errore di Scala: Trovato Lista [Char], richiesto Lista [ScalaObject]
-
26-09-2019 - |
Domanda
Ho questo frammento di codice 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, ", ")
Il prossimo-a-ultima linea compila bene, ma sull'ultima riga ottengo l'errore
List[Char]
Trovato,List[ScalaObject]
richiesto
(labeling
ha il tipo Map[State, Set[Char]]
.)
Sono un po 'sorpreso, dal momento che 1) ho pensato che List[Char]
potrebbe essere visto come un sottotipo di List[ScalaObject]
(al contrario di Java), e 2) la riga sopra le compilazioni ultima linea! (trans
ha Tipo Map[State, Set[State]]
però ...)
La domanda è ovvia, che cosa sto facendo male, e come posso risolvere il problema?
Soluzione
Char
non è un sottotipo di ScalaObject
.
Nella parte superiore si hanno Any
che un super tipo di tutto. Probabilmente si può sostituire con ScalaObject
Any
e che dovrebbe rendere il codice di compilazione.
http://www.scala-lang.org/node/128 per un diagramma gerarchia tipo.
Nel REPL è possibile utilizzare la funzione implicitamente al tipo rapporti Risoluzione dei problemi:
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]]
Modifica:? A proposito, sai di mkString
trans(s).mkString("[", ", ", "]")