gpt4 book ai didi

Scala reduceLeft : 0. asInstanceOf[B]

转载 作者:行者123 更新时间:2023-12-04 00:50:25 25 4
gpt4 key购买 nike

<分区>

继续 my series关于奇怪的源代码。

查看 Scala 2.12.12 scala.collection.TraversableOnce#reduceLeft#reducer我发现了一条非常奇怪的线:

def reduceLeft[B >: A](op: (B, A) => B): B = {
if (isEmpty)
throw new UnsupportedOperationException("empty.reduceLeft")

object reducer extends Function1[A, Unit] {
var first = true
var acc: B = 0.asInstanceOf[B] // <<<<===

override def apply(x: A): Unit =
if (first) {
acc = x
first = false
}
else acc = op(acc, x)
}
self foreach reducer
reducer.acc
}

实际上是什么0.asInstanceOf[B]做?它是使每种类型“可为空”的解决方法吗?

例如,有

Seq("1", "2").reduceLeft(_ + _)

表示运行时的以下代码

var acc: B = 0.asInstanceOf[String]

为什么这不能简单地替换为 var acc: B = null ?因为需要引入 implicit ev: Null <:< A1或者什么?

更新:

此外,简单地类型转换Int任何其他类型都会抛出异常:

println(0.asInstanceOf[String])

抛出运行时异常:

Exception in thread "main" java.lang.ClassCastException: 
java.lang.Integer cannot be cast to java.lang.String

但为什么它在使用 reducer 时不抛出异常?

更新 2:

深入研究,

def foo[A]: A = 1.asInstanceOf[A]

println(foo[String]) // 1
println(foo[LocalDateTime]) // 1
println(foo[LocalDateTime].getClass) // java.lang.Integer

Source code

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com