Scala 在映射到映射时避免通过擦除消除

Scala 在映射到映射时避免通过擦除消除,scala,type-erasure,Scala,Type Erasure,我想映射一个类型为列表[~(a,选项[B])]的映射,但在映射之前,我将其按a分组。现在我可以映射它,我必须匹配映射的元组: val rawData: List[A ~ Option[B]] rawData .groupBy(_._1) .map(case (first: A, second: Seq[A ~ Option[B]]) => C(first, second.map(_._2)) ) 现在编译器警告我: non-variable t

我想映射一个类型为<代码>列表[~(a,选项[B])]的映射,但在映射之前,我将其按a分组。现在我可以映射它,我必须匹配映射的元组:

val rawData: List[A ~ Option[B]]

rawData
    .groupBy(_._1)
    .map(case (first: A, second: Seq[A ~ Option[B]]) => 
        C(first, second.map(_._2))
    )
现在编译器警告我:

non-variable type argument anorm.~[A,Option[B]] in type pattern Seq[anorm.~[A,Option[B]]] is unchecked since it is eliminated by erasure

我找到了几种解决方案,使匹配成为可能,但我有一种感觉,也可以避免匹配,因为我只想浏览已经定义了类型的映射。这怎么可能呢?

在这种情况下,您实际上不必担心这一点。错误是因为您的case语句太冗长。更改为:

rawData.groupBy(_._1).map(case (first, second) => 
  C(first, second.map(_._2))
)

case语句中的类型限制元组的类型(这是不必要的)。但是,他们限制它的方式在运行时无法验证(由于类型擦除),这就是为什么会出现错误。

huh..似乎不起作用。现在我得到以下错误:值映射不是Any@Type在哪个
地图上
?在任何情况下,这都是令人难以置信的奇怪,因为调用
map
的能力完全取决于
rawData
,因为您可以调用
groupBy
…啊..我的错误:我在map中使用了单独的val函数,并且没有正确指定函数参数