将参数化类型集转换为映射

时间:2014-09-12 09:14:18

标签: scala

有人可以向我解释为什么我在下面遇到编译器错误以及进行此类转换的最佳方式

由于 DES

case class A[T](i: Int, x: T)
val set: Set[A[_]] = Set(A(1, 'x'), A(2, 3))
val map: Map[Int, A[_]] = set.map(a => a.i -> a)

type mismatch; found : scala.collection.immutable.Set[(Int, A[_$19]) forSome { type _$19 }] required: Map[Int,A[_]]

1 个答案:

答案 0 :(得分:2)

这里有几件事情,首先我假设A是一个案例类(否则你需要使用new关键字),第二个你的地图返回Set元组(不是Map),第三,你在地图中返回A[_],但a.x返回Any,而不是A

scala> case class A[T](i: Int, x: T)
defined class A

scala> val set: Set[A[_]] = Set(A(1, 'x'), A(2, 3))
set: Set[A[_]] = Set(A(1,x), A(2,3))

要匹配类型签名,您可以使用toMap并将Map[Int, A[_]]更改为Map[Int, _]

scala> val map: Map[Int, _] = set.map(a => a.i -> a.x).toMap
map: Map[Int, _] = Map(1 -> x, 2 -> 3)

如果您想保留原始签名(Map[Int, A[_]]),则需要在元组中返回A

scala> val map: Map[Int, A[_]] = set.map(a => a.i -> a).toMap
map: Map[Int,A[_]] = Map(1 -> A(1,x), 2 -> A(2,3))