Метод, принимающий Seq [T] для возврата строки, а не Seq [Char]

Я хотел бы реализовать метод, который принимает произвольный Seq[T] и возвращает Seq[T]. Но когда String предоставляется, он также должен возвращать String.

Передача String работает из-за неявного преобразования из String в 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

Да, это возможно. Вам понадобится один из тех причудливых CanBuildFrom s:

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
}

Это также будет работать с массивами. Бонус: все строки в вашем примере будут компилироваться и работать как ожидалось.