加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

如何获取scala中的(不可变的和可变的)集合的列表?

发布时间:2020-12-16 09:19:56 所属栏目:安全 来源:网络整理
导读:我尝试构建(可变和不可变)集合的列表.编译器遇到麻烦,因为它无法弄清该列表的类型.我一直以为可以连接任何类型的列表,并且新列表的类型是连接列表的一种超类型.在下面的例子中,我定义了一些列表.您可以看到编译器给出的那些列表的类型: val intList = List(
我尝试构建(可变和不可变)集合的列表.编译器遇到麻烦,因为它无法弄清该列表的类型.我一直以为可以连接任何类型的列表,并且新列表的类型是连接列表的一种超类型.在下面的例子中,我定义了一些列表.您可以看到编译器给出的那些列表的类型:

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,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]]还是编译器中的一种错误?

非常感谢您的答案:-)

解决方法

这是一个bug,并在夜间版本中修复,因为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,3),Set(2,1,3))

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读