为什么在seqop
中使用A时,在方括号中没有A的聚合函数声明?
def aggregate[B](z: B)(seqop: (B, A) ⇒ B, combop: (B, B) ⇒ B): B
而不是
def aggregate[A,B](z: B)(seqop: (B, A) ⇒ B, combop: (B, B) ⇒ B): B
答案 0 :(得分:2)
我想你在谈论Scala集合。 aggregate
是特征GenTraversableOnce
的方法,它已经由类型参数A
参数化:
trait GenTraversableOnce[+A] {
...
abstract def aggregate[B](z: ⇒ B)(seqop: (B, A) ⇒ B, combop: (B, B) ⇒ B): B
}
因此,您不需要声明另一个类型参数A
,因为它已经定义了!此外,如果您声明一个新的类型参数A
,它将会遮挡现有的A
,这将导致您不想要的内容。
答案 1 :(得分:1)
如果你引用TraversableOnce#aggregate
,那是因为A
是TraversableOnce
特征的类型参数。
代码看起来像这样:
trait TraversableOnce[+A] extends Any with GenTraversableOnce[A] {
def aggregate[B](z: =>B)(seqop: (B, A) => B, combop: (B, B) => B): B =
foldLeft(z)(seqop)
// ... and many other things ...
}
A
参数由特征绑定,B
参数由方法绑定。