2011-07-15 9 views
15

私は(変更可能で不変の)セットのリストを作成しようとしています。コンパイラは、そのリストの型を理解できないので、問題に陥る。私はいつもどんなタイプのリストにも接続できると思っていました。新しいリストのタイプは、接続されたリストのスーパータイプの一種です。次の例では、いくつかのリストを定義します。あなたは、コンパイラによって与えられ、これらのリストの種類を見ることができます:スカラーの(不変かつ変更可能な)セットのリストを取得するには?

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]] 

は今、私はこれらのリストを接続するための:::演算子を使用します。

val intStringList = intList:::stringList //List[Any] 
val intMSetList = intList:::mSetList //List[Any] 
val intISetList = intList:::iSetList //List[Any] 

期待、コンパイラが共通のスーパータイプを計算したよう(List[Any] )の両方のリストの。

val iSetmSetList = iSetList:::mSetList //type error 
をしかし、私は明示的にそれが動作する、二つのリストを「キャスト」場合:しかし、次はコンパイルされません

私はそれの正しい種類を取得するには、コンパイラを手助けしなければならないのはなぜ
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]] 

リスト?そして、単にそれを単にList[Any]と入力するのではなく、エラーが発生するのはなぜですか?理論的にはタイプList[scala.collection.Set[Int]]を計算することは不可能ですか、それともコンパイラの一種のバグですか?

おかげで

+4

:// stackoverflowの。 com/questions/5734755/scala-type-widening-of-foott-ttはhttps://issues.scala-lang.org/browse/SI-4501で修正されました。 6/25よりも夜間に挑戦しようとする価値がありますか? – huynhjl

答えて

5

:-)あなたの答えのためにたくさんそれはバグだった、とhuynhjlが疑われるとして、夜間のバージョンで修正されています

私はHTTPで考えさせる
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)) 
関連する問題