Ниже приведен источник метода 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
.