gpt4 book ai didi

scala - 奇怪的 Scala ClassCastException

转载 作者:行者123 更新时间:2023-12-01 09:03:18 24 4
gpt4 key购买 nike

以下代码可以编译,但在最后一行抛出异常。为什么是这样?我怎样才能避免它? (下面的代码是为了显示问题;我确实需要在实际代码中做类似的事情。)

type F = Int => Int

val f: Int => Int = identity
val g1: F => F = identity
val g2: F => F = (identity _).asInstanceOf[F => F]

println("f = " + f)
println("g1 = " + g1)
println("g2 = " + g2)

val h1: Int => Int = g1(f: Int => Int)
val h2: Int => Int = g2(f: Int => Int)

这是代码的输出:

f = doodle.Bug$$$Lambda$7/1836797772@4b53f538
g1 = doodle.Bug$$$Lambda$8/1383547042@543e710e
g2 = doodle.Bug$$$Lambda$9/3213500@57f23557

异常(exception)情况:

java.lang.ClassCastException: doodle.Bug$$$Lambda$7/1836797772 cannot be cast to scala.runtime.Nothing$

我发现转换 g2 导致对 f 的隐式转换特别奇怪...

最佳答案

大胆猜测:菊石表明:

(identity _)

有一种类型:

Nothing => Nothing

Scala 可能会记住这个事实。可能是因为特化或(更有可能)可能是 identity 的 Eta 扩展创建一个闭包,记住它是 Nothing => Nothing下面调用的函数 identity .

在这种情况下,当您在 JVM 进行实际检查的上下文中使用它时(因此不是在您运行 asInstanceOf 的那一刻,而是在应用程序期间),然后转换失败并且您会看到异常。

identity[F] _

无一异常(exception)地按预期工作。

关于scala - 奇怪的 Scala ClassCastException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49929752/

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