J'essayais de résoudre le problème 7 du 99 Scala Problems et j'ai rencontré quelques difficultés à trouver le type d'un List
qui peut contenir n'importe quel type. J'ai donc regardé la réponse et j'ai vu que c'était List[Any]
. Je continuai à coder sur une mise en œuvre comme suit:Scala: Pourquoi isInstanceOf [List [Any]] ne fonctionne-t-il pas?
def flatten(lst: List[Any]): List[Any] = lst match {
case Nil => Nil
case x::xs =>
(if (x.isInstanceOf[List[Any]]) { flatten(x) } else { List(x) }) :::
flatten(xs)
}
Cependant, cela me donne l'erreur de compilation suivante:
[error] <filename omitted>:<line number omitted>: type mismatch;
[error] found : Any
[error] required: List[Any]
[error] (if (x.isInstanceOf[Any]) { flatten(x) } else {List(x) })
[error] ^
[error] one error found
Changer isInstanceOf[List[Any]]
à isInstanceOf[List[_]]
donne la même erreur de compilation.
Après une courte this solution, je mis en œuvre cette recherche google et consulter:
def flatten(lst: List[Any]): List[Any] = lst match {
case Nil => Nil
case x::xs => x match {
case x: List[_] => flatten(x) ::: flatten(xs)
case _ => x :: flatten(xs)
}
}
qui fonctionne parfaitement bien. Alors pourquoi le compilateur Scala pense-t-il que x
a le type Any
alors que, pour entrer dans ce bloc, il doit passer x.isInstanceOf[Any]
, ce qui le rend de type List[Any]
? Est-ce un bug de compilateur, ou est-ce une partie de Scala que je ne comprends pas?
Merci!
Merci Nicolas! C'est un grand oubli de ma part. – yanhan