Scala 方法如何接受a(T<;:Seq)[a]并返回T[B]——具有不同类型参数的相同类型的序列?

Scala 方法如何接受a(T<;:Seq)[a]并返回T[B]——具有不同类型参数的相同类型的序列?,scala,Scala,我想实现一个方法,它接受一个元素类型的序列,并返回一个不同元素类型的序列。如何一般地执行此操作,以便返回序列的相同子类 我的方法当前如下所示: def lookerUpper(ids : Seq[String], someOtherInfo : Int) : Seq[UsefulData] = { ... retrieve data for each id ... } 我希望它更通用,这样无论传入何种类型的序列(字符串),都是返回的序列(有用数据)。向量和列表,特别是,或者尽可能的通用

我想实现一个方法,它接受一个元素类型的序列,并返回一个不同元素类型的序列。如何一般地执行此操作,以便返回序列的相同子类

我的方法当前如下所示:

def lookerUpper(ids : Seq[String], someOtherInfo : Int) : Seq[UsefulData] = {
    ... retrieve data for each id ...
}
我希望它更通用,这样无论传入何种类型的序列(字符串),都是返回的序列(有用数据)。向量和列表,特别是,或者尽可能的通用


这可以用Scala的类型系统表示吗?“返回与此参数相同的类型,除了使用不同的类型参数。”

要获得完整的答案,请查看我关于构建器的较长问题和答案(注意:截至2012年9月,Miles的替代版本在2.9或最新的2.10版本中均不起作用)

这里有一个框架可以让您开始(请注意显式和隐式参数块的奇怪格式,以避免在SO上显示过长的行):

并观察其是否有效:

scala> lookerUpper(Vector("salmon","cod"),2)
res0: scala.collection.immutable.Vector[UsefulData] = 
  Vector(UsefulData(8), UsefulData(5))

scala> lookerUpper(Array("salmon","cod"),2)
res1: Array[UsefulData] = 
  Array(UsefulData(8), UsefulData(5))


编辑:如果您只关心
TraversableLike
(而
Array
不是)的子类,并且您将使用标准收集操作来完成所有工作,那么您可以使用Luigi指出的。(也许我应该把这个答案作为另一个角度移到那里。)

你应该使用我在中使用的那种构建器策略
scala> lookerUpper(Vector("salmon","cod"),2)
res0: scala.collection.immutable.Vector[UsefulData] = 
  Vector(UsefulData(8), UsefulData(5))

scala> lookerUpper(Array("salmon","cod"),2)
res1: Array[UsefulData] = 
  Array(UsefulData(8), UsefulData(5))