小编Jan*_*Jan的帖子

如何在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]]
Run Code Online (Sandbox Code Playgroud)

现在我使用:::运算符连接这些列表:

val intStringList = intList:::stringList //List[Any]
val intMSetList = intList:::mSetList //List[Any]
val intISetList = intList:::iSetList //List[Any]
Run Code Online (Sandbox Code Playgroud)

正如所料,编译器计算List[Any]两个列表的公共超类型().但以下不编译:

val iSetmSetList = iSetList:::mSetList //type error
Run Code Online (Sandbox Code Playgroud)

但是,如果我明确地"投射"这两个列表,它的工作原理是:

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]]
Run Code Online (Sandbox Code Playgroud)

为什么我必须帮助编译器获取该列表的正确类型?为什么它会产生错误而不是简单地输入List[Any]?从理论上讲,计算类型List[scala.collection.Set[Int]]是不可能的,还是编译器中的一种错误?

非常感谢你的回答 :-)

scala mutable type-conversion immutability

15
推荐指数
1
解决办法
672
查看次数

标签 统计

immutability ×1

mutable ×1

scala ×1

type-conversion ×1