Ниже приведен источник метода reduceLeft для Scala TraversableOnce. Что происходит с линией, которая читает var acc: B = 0.asInstanceOf[B]?
Мне кажется, что если я назову это в списке строк, например List("a", "b", "c"), это приведет к чему-то вроде 0.asInstanceOf[String]. Тем не менее, 0.asInstanceOf[String] выдает a ClassCastException во время выполнения, если я его попробую прямо.
Что происходит с этой линией, и почему она отличается от вызова 0.asInstanceOf[String] непосредственно при вызове в списке строк?
def reduceLeft[B >: A](op: (B, A) => B): B = {
if (isEmpty)
throw new UnsupportedOperationException("empty.reduceLeft")
var first = true
var acc: B = 0.asInstanceOf[B]
for (x <- self) {
if (first) {
acc = x
first = false
}
else acc = op(acc, x)
}
acc
}
Бонусный вопрос: почему acc даже инициализируется этим значением? Похоже, что код в первой итерации цикла for просто перезапишет это значение первым элементом в объекте TraversableOnce.