无法将参数化类型的seq转换为地图

时间:2017-05-03 11:24:07

标签: scala

为什么以下代码:

case class Test[E](name: String, e: E)
val seq = Seq[Test[_]]()
val map = seq.map(i => i.name -> i).toMap

给我这个编译器错误:

  

无法证明(String,Test [_ $ 1])forSome {type _ $ 1}<:< (T,U)

1 个答案:

答案 0 :(得分:3)

您的两个选择是:

case class Test[E](name: String, e: E)

val seq = Seq[Test[_]]()
val map = seq.map(i => i.name -> i).toMap[String, Test[_]]

或者您也可以提前“告知”编译器有关地图类型的信息,这也适用。

val seq = Seq.empty[Test[_]]
val map: Map[String, Test[_]] = seq.map(i => i.name -> i).toMap

为什么这不起作用

至于为什么这不起作用,它确实应该,但是会发生什么是Scala使用隐式来确定集合的内部类型M[X] <: TraversableOnce[X]是一个元组,并且在{{1}中找到了签名。

toMap

您关注的部分是 def toMap[T, U](implicit ev: A <:< (T, U)): immutable.Map[T, U] ,这表示A <:< (T, U)实际上是A的子类型,其中Tuple2[T, U]应该成为关键字型,T值类型。 U是集合的原始基础类型。

除非你明确提供,否则编译器不够智能推断A,而且似乎它与存在类型也没有任何关系。

理论上,您应该能够轻松地将任何可遍历转换为地图,并且我们可以重建使用更高种类调用(T, U)时发生的情况。

toMap