在我的Scala 2.11.6应用程序中,我定义了一个immutable.ParMap
类似的代码:
object Foos {
val foos: immutable.ParMap[String, Foo] = immutable.ParMap(
...
)
}
稍后,我想immutable.ParMap
使用相同的键创建一个新的键,因此我使用mapValues
:
val fooServices: immutable.ParMap[String, FooService] = Exchanges.exchanges mapValues (_.fooService)
Scala抱怨
类型ParMap [String,FooService]的表达式不符合预期的类型ParMap [String,FooService]。
作为解决方法,我可以使用for理解,编译器允许:
val fooServices: immutable.ParMap[String, FooService] =
for ((name, ex) <- Foos.foos) yield name -> foo.fooService
但是,能够使用专为该确切任务而设计的库函数会很不错。为什么mapValues
在这里不能推断出最具体的类型?
推断最具体的类型不是问题。它实际上是的实例scala.collection.parallel.ParMapLike$$anon$2
,是基础地图的视图(创建的地图将所有操作转发到原始地图)。
本来可以为不可变和可变的分支分别创建的,但是要在库中更好地共享代码,只需在中创建一次即可ParMapLike
。因此,返回类型是正确的,因为不可变的类型.mapValues
与可变的类型相同.mapValues
。
如果您不想要视图(实现为代理),而是想要真正地重新生成集合,请map
改为使用。即xs.mapValues(v => f(v))
成为xs.map{ case (k,v) => (k, f(v)) }
,然后ParMap
将这样生成并键入新的不可变项。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句