在这个参数化函数中,为什么我需要投射?我怎样才能摆脱它?在这个参数化的Scala函数中,为什么我需要投射?
/** Filters `xs` to have only every nth element.
*/
def everyNth[A <% Iterable[B], B](xs: A, n: Int, offset: Int = 0): A =
(xs.zipWithIndex collect { case (x, i) if (i - offset) % n == 0 => x }).asInstanceOf[A]
如果我没有在最后的演员,我得到这个错误信息:
type mismatch; found : Iterable[B] required: A
此功能(跟投)适用于我试过它的所有案件,我打字之类的东西在REPL以下是Scala是能够正确推断的结果类型时不是在参数化功能的情况下知道:
scala> val a: Stream[Int] = (Stream.from(0).zipWithIndex collect { case (x, i) if (i + 3) % 5 == 0 => x })
a: Stream[Int] = Stream(2, ?)
scala> a take 10 force
res20: scala.collection.immutable.Stream[Int] = Stream(2, 7, 12, 17, 22, 27, 32, 37, 42, 47)
请解释!
类似的问题,它使用'CanBuildFrom'来解决问题:[一般采用一种类型并返回相同类型的函数](http://stackoverflow.com/questions/10019529/function-which-generically-takes-一型和返回最相同类型)。我不能用它来解决这个问题,别人? – sschaef 2012-08-04 10:07:08
我得到了CanBuildFrom来解决我的问题,并将解决方案放在答案中。如果您好奇,请参阅下面的答案。 – Douglas 2012-08-07 18:08:54
好的答案!顺便说一句,你可以接受你自己的答案... – sschaef 2012-08-08 17:02:19