2011-07-15 2 views
15

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 :-)

+4

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

Répondre

5

Il était un bug, et est corrigé dans les versions de nuit, comme huynhjl soupçonné:

Welcome to Scala version 2.10.0.r25234-b20110705020226 
    (Java HotSpot(TM) 64-Bit Server VM, Java 1.6.0_24) 
Type in expressions to have them evaluated. 
Type :help for more information. 
. . . 
scala> val iSetmSetList = iSetList:::mSetList //type error 
iSetmSetList: List[scala.collection.Set[Int]] = List(Set(1, 2, 3), Set(2, 1, 3)) 
Questions connexes