gpt4 book ai didi

scala - 为什么 AnyVal 可以在 Scala 运行时转换为 AnyRef?

转载 作者:行者123 更新时间:2023-12-04 11:23:49 28 4
gpt4 key购买 nike

下面的代码可以编译没有错误。

val a: Int = 1
val b = a.asInstanceOf[AnyRef]

这让我感到困惑,因为 Int 扩展了 AnyVal,它不是 AnyRef 的子类,而是 AnyRef 的兄弟。

但是,如果按以下方式使用归属:
val a: Int = 1
val b: AnyRef = a

它不起作用。
error: type mismatch;
found : Int
required: AnyRef
Note: an implicit exists from scala.Int => java.lang.Integer, but
methods inherited from Object are rendered ambiguous. This is to avoid
a blanket implicit which would convert any scala.Int to any AnyRef.
You may wish to use a type ascription: `x: java.lang.Integer`.
val b: AnyRef = a

我的理解是:
asInstanceOf在运行时执行,它强制编译器相信 val a 是一个 AnyRef。
但是,ascription 是在编译时,转换不能通过类型检查,所以我们有一个“类型不匹配”的错误。

我的问题:
  • 基本上,为什么转换在运行时工作?
  • 如果 AnyRef 在 JVM 中被认为是 java.lang.Object,那么 AnyVal 呢?它是运行时的对象吗?
  • (如果是,它的类型是什么?java.lang.Object?但 AnyVal 是 AnyRef 的兄弟,不是吗?)
  • (如果没有,我们如何使用某些 AnyVal 的子类作为对象,例如 Int、Double)
  • scala 编译器有什么技巧吗?
  • 最佳答案

    这是因为自动装箱:

    scala>val a: Int = 1
    a: Int = 1
    scala> a.getClass
    res2: Class[Int] = int
    scala> val b = a.asInstanceOf[AnyRef]
    b: AnyRef = 1
    scala> b.getClass
    res1: Class[_ <: AnyRef] = class java.lang.Integer

    通过强制转换为 AnyRef ( java.lang.Object ) 你触发从 int 到 java.lang.Integer 的自动装箱

    If AnyRef is considered as java.lang.Object in JVM, how about AnyVal ? Is it an Object at run time ?


    AnyRef确实是 java.lang.Object 的别名 AnyVal是一个“虚拟”类型,它只存在于编译时为了类型系统的完整性。

    在运行时实例扩展 AnyVal除了 int 之外,被转换为相应的原生类型( doubleString 等)转到 java.lang.String它本身扩展 java.lang.Object但在 JVM 中有特殊处理。

    But AnyVal is sibling of AnyRef, isn't it ?)



    两者 AnyValAnyRef扩展类型 Any但它们不会相互延伸。

    Are there some tricks played by scala compiler ?



    负载:)

    有关 Scala 类型层次结构的更完整解释,我建议您从阅读开始: http://docs.scala-lang.org/tutorials/tour/unified-types.html

    关于scala - 为什么 AnyVal 可以在 Scala 运行时转换为 AnyRef?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25931611/

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