哪种类型的运营商

时间:2014-11-03 22:31:34

标签: scala

import scala.collection.immutable.ListMap

trait Foo {
  val begin: Int
}

object Test {
  def beginIndex[T <: Vector[Foo]](data: T): ListMap[Int, T] = {
    data.foldLeft(ListMap[Int, T]())({case (map, e) => map + ((e.begin, (map(e.begin) :+ e)))})
}

给我错误

found   : scala.collection.immutable.Vector[Foo]
required: T

我认为<:是不正确的类型操作符,但我不确定是哪个 一个是正​​确的答案。

1 个答案:

答案 0 :(得分:2)

您正在使用正确的类型运算符,但是,因为您正在使用scala集合api,您需要为类型为T的集合提供构建器,否则scala将默认使用{{1} }构建器只能返回Vector而不是Vector。如果为隐式T构建器添加需求,则可以编译它:

T

如果您正在使用继承自def beginIndex[T <: Vector[Foo]](data: T)(implicit bf : CanBuildFrom[scala.collection.immutable.Vector[Foo], Foo, T]): ListMap[Int, T] = { data.foldLeft(ListMap[Int, T]())({case (map, e) => map + ((e.begin, (map(e.begin) :+ e)))}) } 的scala集合,那么您可能很幸运,因为它可能已经有一个不明确的构建器,但我不确定您是否可以获取类型锻炼,但Vector应该有效。作为旁注,我不认为您的功能可以正常工作,因为Vector将始终尝试从空地图中获取值并抛出异常。

map(e.begin)