采用Seq [T]返回String而不是Seq [Char]的方法

时间:2012-05-21 16:42:22

标签: scala scala-collections

我想实现采用任意Seq[T]并返回Seq[T]的方法。但是当提供String时,它也应该返回String

由于从StringString的隐式转换,传递WrappedString extends IndexedSeq[Char]的工作正常,但我得到Seq[Char]作为回报。是否可以让String回来?

val sx: Seq[Int] = firstAndLast(List(1, 2, 3, 4))
val s1: Seq[Char] = firstAndLast("Foo Bar")
val s2: String = firstAndLast("Foo Bar")  //incompatible types error

def firstAndLast[T](seq: Seq[T]) = Seq(seq.head, seq.last)

firstAndLast()实施无关紧要,只是一个例子。

1 个答案:

答案 0 :(得分:15)

是的,有可能。你必须要求其中一个花哨的CanBuildFrom

import scala.collection.generic.CanBuildFrom

def firstAndLast[CC, A, That](seq: CC)(implicit asSeq: CC => Seq[A], cbf: CanBuildFrom[CC, A, That]): That = {
  val b = cbf(seq)
  b.sizeHint(2)
  b += seq.head
  b += seq.last
  b.result
}

这也适用于数组。额外奖励:您示例中的所有行都将按预期编译并运行。