gpt4 book ai didi

generics - 具有通配符类型参数的 Map 上的 flatMap

转载 作者:行者123 更新时间:2023-12-02 19:24:41 25 4
gpt4 key购买 nike

我正在尝试写这样的东西:

trait Typed[T]

trait Test {

def testMap: Map[Typed[_], Int]

def test = testMap.flatMap {case (typed, size) => Seq.fill(size)(typed)}
}

但我收到以下错误:

error: no type parameters for method flatMap: (f: ((Typed[_], Int)) => Traversable[B])(implicit bf: scala.collection.generic.CanBuildFrom[scala.collection.immutable.Map[com.quarta.service.querybuilder.Typed[_],Int],B,That])That exist so that it can be applied to arguments (((Typed[_], Int)) => Seq[Typed[_0]] forSome { type _0 })
--- because ---
argument expression's type is not compatible with formal parameter type;
found : ((Typed[_], Int)) => Seq[Typed[_0]] forSome { type _0 }
required: ((Typed[_], Int)) => Traversable[?B]
def test = testMap.flatMap {case (typed, size) => Seq.fill(size)(typed)}

如果将 testMap 类型更改为:

,则此代码有效
def testMap: Map[Typed[Any], Int]

有什么区别以及如何解决我的问题?

最佳答案

如果我正确理解你的问题,答案是:你可以这样做,如果 Typed协变于 T ,即trait Typed[+T] .

示例

scala> :paste
// Entering paste mode (ctrl-D to finish)

class Typed[+T: Manifest] {
override def toString = "Typed[" + implicitly[Manifest[T]].toString + "]"
}

trait Test {
def testMap: Map[Typed[_], Int]

def foo = testMap flatMap { case (t, s) => Seq.fill(s)(t) }
}

val bar = new Test {
def testMap = Map(new Typed[Double]() -> 3, new Typed[Int]() -> 5)
}

// Hit Ctrl-D

scala> bar.foo
res0: scala.collection.immutable.Iterable[Seq[Typed[Any]]] = List(Typed[Double], Typed[Double], Typed[Double], Typed[Int], Typed[Int], Typed[Int], Typed[Int], Typed[Int])

请注意,我已经创建了 Typed本例中的一个类以获得更好的输出。您当然可以坚持使用 trait .

现在,为什么这里需要协方差?

协方差基本上意味着如果 A <: B然后X[A] <: X[B] 。因此,如果您声明 testMapMap[Typed[Any], Int]Typed不变的,你不被允许通过,例如一个Typed[Double]对于Typed[Any]即使Double <: Any 。在这里,scala 编译器似乎正在替换 _Any在协变情况下(请参阅即兴评论以获取对此的详细说明)。

有关下划线问题的解释,我会引用 Luigi 的回答。

关于generics - 具有通配符类型参数的 Map 上的 flatMap,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9233115/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com