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

Tom*_*icz 11 scala scala-collections

我想实现任意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)
Run Code Online (Sandbox Code Playgroud)

firstAndLast() 实现是无关紧要的,它只是一个例子.

Jea*_*let 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
}
Run Code Online (Sandbox Code Playgroud)

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

  • @ DanielC.Sobral听起来很有趣; 一个例子怎么样? (3认同)
  • 它确实有效,因为所需的`ClassManifest`是隐式提供给提供适当的`CanBuildFrom`,`scala.Array.canBuildFrom`的方法. (2认同)
  • 我猜,Miles的"FromRepr"应该会更容易. (2认同)
  • @ Jean-Philippe,感谢您的回答和后续评论.我被激怒试图找到asSeq的含义来自何处并发现以下[命令](http://blog.jetbrains.com/scala/2011/10/25/show-implicit-parameters-action/)Ctrl IntelliJ上的+ Shift + P表示呼叫站点的实际隐式参数. (2认同)