采用 Seq[T] 返回字符串而不是 Seq[Char] 的方法



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

传递String由于从StringWrappedString 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()实现无关紧要,它只是一个示例。

是的,这是可能的。您必须要求其中一种花哨的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
}

这也适用于数组。奖励:示例中的所有行都将按预期编译和工作。

最新更新