Как получить список (неизменяемых и изменяемых) множеств в 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]]

Теперь я использую оператор ::: для соединения этих списков:

val intStringList = intList:::stringList //List[Any]
val intMSetList = intList:::mSetList //List[Any]
val intISetList = intList:::iSetList //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]] или это своего рода ошибка в компиляторе?

Большое спасибо за ответы: -)

15
задан axel22 15 July 2011 в 13:33
поделиться