我尝试构建(可变和不可变)集合的列表。编译器遇到麻烦,因为它无法弄清楚该列表的类型。我一直认为我可以连接任何类型的列表,并且新列表的类型是连接列表的一种超类型。在以下示例中,我定义了一些列表。您可以看到编译器给出的那些列表的类型:
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]]
或者它是编译器中的一种错误吗?
非常感谢您的回答: - )
答案 0 :(得分:5)
这是一个错误,并在夜间版本中修复,正如huynhjl所怀疑的那样:
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))