Scala 如何从泛型方法返回原始集合类型

Scala 如何从泛型方法返回原始集合类型,scala,generics,scala-generics,Scala,Generics,Scala Generics,我有一个泛型方法,它应该返回与输入类型相同的集合: def removeN[A, C <: Seq[A]](s: C, n: Int): C = { s.take(n) ++ s.drop(n + 1) // Sample operation } def removeN[A,C您所要求的功能可以使用collections library最强大但最有争议的功能之一来完成,即CanBuildFrom import scala.language.higherKinds import sca

我有一个泛型方法,它应该返回与输入类型相同的集合:

def removeN[A, C <: Seq[A]](s: C, n: Int): C = {
  s.take(n) ++ s.drop(n + 1) // Sample operation
}

def removeN[A,C您所要求的功能可以使用collections library最强大但最有争议的功能之一来完成,即
CanBuildFrom

import scala.language.higherKinds
import scala.collection.generic.CanBuildFrom

def removeN[A, C[A] <: Seq[A]](s: C[A], n: Int)
  (implicit cbf: CanBuildFrom[C[A], A, C[A]]): C[A] = {
  val builder = cbf()
  builder.sizeHint(s.size)
  builder ++= s.take(n)
  builder ++= s.drop(n + 1)
  builder.result()
}
它似乎起作用了

需要导入scala.language.higherKinds
,以避免对更高种类(C[a])的使用发出警告

scala> removeN(List(4, 5, 6), 2)
res0: List[Int] = List(4, 5)

scala> removeN(Vector(4, 5, 6), 2)
res1: scala.collection.immutable.Vector[Int] = Vector(4, 5)