如果我正确阅读类型签名,Array.reduce
必须返回数组中项目类型的子类?这似乎是一个完全武断和不必要的限制?
inline fun <S, T : S> Array<out T>.reduce(
operation: (acc: S, T) -> S
): S
来源为什么不能是一个任意的类呢?
fun main(params: Array<String>) {
val args = params.reduce(Args(), {accum: Args, arg: String -> accum.parse(arg) })
}
实际上正好相反:返回类型必须是数组中数据的超类型,而不是子类型。我不认为这和可变性有任何关系。
原因是在第一次迭代中,数组中的第一项成为累加器。因此,如果数组包含整数,但累加器是String
类型,则第一步是不可能的。
fold()
的工作方式不同:它接收累加器的初始值作为参数,所以它可以是任何类型。
这是因为Array.reduce
为非突变还原。对于突变还原,您需要使用Array.fold
。