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

scala – flatMap行为在2.10.0中更改

发布时间:2020-12-16 21:33:10 所属栏目:安全 来源:网络整理
导读:我将一些代码从2.9转换为2.10,并遇到意外的编译错误.这是最小的形式: 在2.9.2中,这工作正常: scala List(1).flatMap(n = Set(1).collect { case w = w })res0: List[Int] = List(1) 在2.10.0中,我们收到一个错误: scala List(1).flatMap(n = Set(1).colle
我将一些代码从2.9转换为2.10,并遇到意外的编译错误.这是最小的形式:

在2.9.2中,这工作正常:

scala> List(1).flatMap(n => Set(1).collect { case w => w })
res0: List[Int] = List(1)

在2.10.0中,我们收到一个错误:

scala> List(1).flatMap(n => Set(1).collect { case w => w })
<console>:8: error: no type parameters for method flatMap: (f: Int => scala.collection.GenTraversableOnce[B])(implicit bf: scala.collection.generic.CanBuildFrom[List[Int],B,That])That exist so that it can be applied to arguments (Int => scala.collection.immutable.Set[_ <: Int])
 --- because ---
argument expression's type is not compatible with formal parameter type;
 found   : Int => scala.collection.immutable.Set[_ <: Int]
 required: Int => scala.collection.GenTraversableOnce[?B]
              List(1).flatMap(n => Set(1).collect { case w => w })
                      ^
<console>:8: error: type mismatch;
 found   : Int => scala.collection.immutable.Set[_ <: Int]
 required: Int => scala.collection.GenTraversableOnce[B]
              List(1).flatMap(n => Set(1).collect { case w => w })
                                ^
<console>:8: error: Cannot construct a collection of type That with elements of type B based on a collection of type List[Int].
              List(1).flatMap(n => Set(1).collect { case w => w })
                             ^

但是,如果我明确地将内部结果转换成List或明确指定flatmap的泛型类型,那么它在2.10.0中可以正常工作:

scala> List(1).flatMap(n => Set(1).collect { case w => w }.toList)
res1: List[Int] = List(1)
scala> List(1).flatMap[Int,List[Int]](n => Set(1).collect { case w => w })
res2: List[Int] = List(1)

有人可以向我解释什么变化是2.10导致类型推断在这里失败,当它不在2.9?

编辑:

深入了解一下,我们可以看到,问题源于收集行为的不同:

在2.9.2中:

scala> Set(1).collect { case w => w }
res1: scala.collection.immutable.Set[Int] = Set(1)

在2.10.0中:

scala> Set(1).collect { case w => w }
res4: scala.collection.immutable.Set[_ <: Int] = Set(1)

大概的原因与Set类似,不同于List,它是类型不变的.但是更完整的解释,特别是给出这种变化的动力的解释将是巨大的.

解决方法

这是一个 bug.你也可以通过键入模式,如在

scala> Set(1).collect { case w => w }
res0: scala.collection.immutable.Set[_ <: Int] = Set(1)

scala> Set(1).collect { case w: Int => w }
res1: scala.collection.immutable.Set[Int] = Set(1)

(编辑:李大同)

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

    推荐文章
      热点阅读