gpt4 book ai didi

scala - Scala 中的对象如何转换为它自己的类型和任何不相关特征的交集?

转载 作者:行者123 更新时间:2023-12-01 10:13:47 29 4
gpt4 key购买 nike

考虑以下几点:

trait Foo { def bar: Any }

现在,3X 甚至没有方法 bar 但这编译:

val a = 3.asInstanceOf[Int with Foo]

object X
val b = X.asInstanceOf[X.type with Foo]

此代码在编译和运行时(在 Scala 2.10.3 上)不会产生任何错误。然而,以下编译干净但会在运行时产生ClassCastException:

val a1 = a.asInstanceOf[Foo]
val b1 = b.asInstanceOf[Foo]

这怎么可能?我几乎可以接受这样一个事实,即没有对显式强制转换执行静态分析/检查,并且不鼓励并且通常不需要它们——尽管我确实认为 Scala 可以发出关于绝对不正确的类型转换的警告考虑到 object X 永远不可能有 Foo 特征,也没有整数——但是我不能轻易接受一个整数可以在运行时转换的事实到包含完全不相关的 非空特征的交集类型。

最佳答案

问题是 JVM 不支持交集类型,因此没有明显的运行时等效于 asInstanceOf[Int with Foo]。这基本上是与 asInstanceOf[T] 相同的问题,其中 T 是一个通用参数(在 Scala 和等效的 Java 中):你也有看起来成功的转换在运行时,但实际上在以后使用 T 方法的代码中插入强制转换。

一种可能是将转换编译为 Int with Foo 作为对 IntFoo 的两次转换,但这不是一般情况下非常有效(例如,当没有运行时转换为 Foo 本身时,或者当值传递给采用 Int with Foo 的方法时)。

关于scala - Scala 中的对象如何转换为它自己的类型和任何不相关特征的交集?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23108978/

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