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
我认为<:
是不正确的类型操作符,但我不确定是哪个
一个是正确的答案。
答案 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)