我想实现任意的方法 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()
实现是无关紧要的,这只是一个例子。
对的,这是可能的。你必须要求其中一个 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
}
这也适用于数组。额外奖励:示例中的所有行都将按预期编译和工作。
对的,这是可能的。你必须要求其中一个 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
}
这也适用于数组。额外奖励:示例中的所有行都将按预期编译和工作。