为什么以下代码:
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)
答案 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