我想实现任意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)
Run Code Online (Sandbox Code Playgroud)
firstAndLast() 实现是无关紧要的,它只是一个例子.
在Scala中调用带有类型参数的方法时,我经常尝试安排代码,以便类型推断器可以找到关于类型参数的自己,而不需要我填写它们.在某些情况下,它失败了,我必须手动提供它们.
大多数情况下,这不是问题,但对于具有多个类型参数的方法(例如,大多数方法需要隐式CanBuildFrom),我想知道是否有一种方法可以帮助类型推理器,只给它一个所需类型参数,并要求它尝试猜测其他参数.它看起来像在内部,它必须做这样的事情,因为它有时产生"预期类型A[B, ?]但得到A[C, D]" 形式的错误消息,这意味着在两个类型参数中A,它可以找到第一个B但是有没有关于第二个的信息.
使用案例: Tomasz的问题,这段代码:
def firstAndLast[CC, A, That](seq: CC)(implicit asSeq: CC => Seq[A], cbf: CanBuildFrom[CC, A, That]): That = {
val b = cbf(seq)
b += seq.head
b += seq.last
b.result
}
Run Code Online (Sandbox Code Playgroud)
无法调用List("abc", "def") map firstAndLast,但这可行:
List("abc", "def") map firstAndLast[String, Char, String]
Run Code Online (Sandbox Code Playgroud)
在这个例子中,我的问题归结为:有没有办法告诉类型inferencer CC参数应该是什么String,并要求它找出自己的A和That?实质上,就像
List("abc", "def") map firstAndLast[CC = String]
Run Code Online (Sandbox Code Playgroud)
要么
List("abc", "def") map firstAndLast[String, <guess>, <guess>] …Run Code Online (Sandbox Code Playgroud)