J'essaie de construire une liste de Sets (mutables et immuables). Le compilateur a des ennuis car il ne peut pas comprendre le type de cette liste. J'ai toujours pensé que je pouvais connecter des listes de tous types et que le type de la nouvelle liste est une sorte de supertype des listes connectées. Dans l'exemple suivant, je définis certaines listes. Vous pouvez voir les types de ces listes, données par le compilateur:Comment faire pour obtenir une liste des ensembles (immuables et mutables) en scala?
val intList = List(1) //List[Int]
val stringList = List("ab") //List[java.lang.String]
val mSetList = List(mutable.Set(1, 2, 3)) //List[scala.collection.mutable.Set[Int]]
val iSetList = List(immutable.Set(1, 2, 3)) //List[scala.collection.immutable.Set[Int]]
Maintenant, j'utiliser l'opérateur :::
pour connecter ces listes:
val intStringList = intList:::stringList //List[Any]
val intMSetList = intList:::mSetList //List[Any]
val intISetList = intList:::iSetList //List[Any]
Comme prévu, le compilateur calcule un supertype commun (List[Any]
) des deux listes. Mais ce qui suit ne compile pas:
val iSetmSetList = iSetList:::mSetList //type error
Mais si je explicitement « cast » les deux listes, cela fonctionne:
val setList1 : List[scala.collection.Set[Int]] = mSetList //List[scala.collection.Set[Int]]
val setList2 : List[scala.collection.Set[Int]] = iSetList // List[scala.collection.Set[Int]]
val setList = setList1:::setList2 //List[scala.collection.Set[Int]]
Pourquoi dois-je aider le compilateur pour obtenir le type correct de cette liste? Et pourquoi produit-il une erreur plutôt que de la taper simplement avec List[Any]
? Est-il théoriquement impossible de calculer le type List[scala.collection.Set[Int]]
ou est-ce une sorte de bogue dans le compilateur?
Merci beaucoup pour vos réponses :-)
Cela me fait penser à http: // stackoverflow. com/questions/5734755/scala-type-élargissement-inférence-de-foott-tt qui a été corrigé avec https://issues.scala-lang.org/browse/SI-4501. Ça vaut le coup d'essayer avec une soirée plus récente que 6/25? – huynhjl