有人可以向我解释为什么我在下面遇到编译器错误以及进行此类转换的最佳方式
由于 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[_]]
答案 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))