在這個參數化函數中,爲什麼我需要投射?我怎樣才能擺脫它?在這個參數化的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