Any、AnyVal、AnyRef、Object 之间有什么关系以及它们在 Java 代码中使用时如何映射?

2023-11-23

我通常会尝试每种组合直到它编译为止。有人可以解释我应该在哪里使用什么吗?


我会不同意Chris's answer一方面。课程Any, AnyRef and AnyVal are类。但由于 JVM 的内在限制,它们在字节码中不会显示为类。

This arises out of the fact that not everything in Java is an object. In addition to objects, there are primitives. All objects in Java are descendant from java.lang.Object, but primitives are set apart and, presently*, not extensible by a programmer. Note also that primitives have "operators", not methods.

另一方面,在 Scala 中,一切is一个对象,所有对象都属于一个类,它们通过方法进行交互。生成的 JVM 字节码并没有反映这一点,但这并没有让它们变得不那么重要,就像 Java 有泛型一样,尽管字节码没有泛型。

所以,在 Scala 中,所有对象都是来自Any,其中包括 Java 所认为的对象和 Java 所认为的原语。 Java 中没有对应的东西,因为没有这样的统一。

Java 中所有被认为是原语的东西都是来自AnyVal在斯卡拉。直到 Scala 2.10.0,AnyVal被密封了,程序员无法扩展它。看看 Scala 在 .Net 上会发生什么应该很有趣,因为仅互操作性就要求 Scala 至少识别用户定义的“基元”。

还延伸Any is AnyRef,这相当于java.lang.Object(无论如何在 JVM 上)。

在 Scala 2.9.x 之前,用户无法扩展Any or AnyVal,也没有从 Java 引用它们,但是有were它们可以在 Scala 中用于其他用途。具体来说,输入签名:

def f(x: AnyVal) = println(x)
def g(x: AnyRef) = println(x)
def h(x: Any) = println(x)

从类层次结构中,每个含义应该是显而易见的。然而值得注意的是,f and h会自动装箱,但是g将不会。这与 Java 的做法有点相反,因为f and h无法指定,并且g(定义为java.lang.Object)会导致自动装箱。

不过,从 Scala 2.10.0 开始,用户可以扩展AnyVal or Any,具有以下语义:

  • 如果班级延长AnyVal,在某些情况下不会在堆上为其创建实例。这意味着该类的字段(在 2.10.0 上只允许使用单个字段——是否会改变还有待观察)将保留在堆栈中,无论它们是基元还是对其他对象的引用。这允许扩展方法而无需实例化成本。

  • 如果一个特质延伸Any,那么它可以与扩展的两个类一起使用AnyRef和扩展的类AnyVal.

PS:在我看来,Java 很可能会效仿 C# 来允许“struct”原语,也许还有 typedef,因为事实证明,不诉诸它们的并行性很难以良好的性能实现。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Any、AnyVal、AnyRef、Object 之间有什么关系以及它们在 Java 代码中使用时如何映射? 的相关文章

  • Scala 中并发混合的最佳实践.Map

    The ScalaDoc http www scala lang org api current index html scala collection mutable ConcurrentMap关于并发Map 是这样说的 已弃用 自版本
  • 获取有关 Groovy 函数的信息(名称、签名、主体代码)

    我有一个 Groovy 文件 其中包含一堆简单的函数 如下所示 useful functions def myFunc1 String arg println Hello arg def myFunc2 String arg println
  • 如何在scala中运行时查找类参数数据类型

    import scala reflect runtime universe import scala reflect runtime universe def getType T TypeTag obj T typeOf T case cl
  • Scala:列表中不同的foldRight实现

    我刚刚发现 scala 我在 2 12 上 提供了完全不同的实现向右折叠 for 不可变列表 and 可变列表 不可变列表 List scala override def foldRight B z B op A B gt B B reve
  • 生成 k 个成对独立的哈希函数

    我正在尝试实施一个计数最小草图 http en wikipedia org wiki Count Min sketchScala中的算法 所以我需要生成k个成对独立的哈希函数 这是一个比我以前编写过的任何东西都低的级别 除了算法类之外 我对
  • 从 Monoids 的 HList 类型派生 0 的 HList

    我正在学习 Shapeless 目前我正在尝试创建一个执行以下操作的函数 给定一个类型HList它返回HList of Nones 与Option对应于给定的类型HList type 例如 create String Int HNil re
  • 重载方法值与替代方法的聚合

    我有以下函数 但无法编译 private def save pea KStream String String Unit pea groupByKey aggregate gt folder String String value Stri
  • Scala 插入列表中的特定位置

    这是我确实解决的问题 但是作为一个完全命令式的 Scala 菜鸟 我觉得我发现了一些完全不优雅的东西 任何改进的想法表示赞赏 val l1 4 1 2 3 4 Nil original list val insert List 88 99
  • scala 元组拆包

    我知道这个问题已经以不同的方式出现过很多次 但我仍然不清楚 有没有办法达到以下目的 def foo a Int b Int foo a b right way to invoke foo foo getParams is there a w
  • Scala 中简单表达式的非法开始

    我刚刚开始学习scala 在尝试实现递归函数时 我在 Eclipse 中收到错误 简单表达式的非法开始 def foo total Int nums List Int if total nums sorted head 0 0 else r
  • Scala Spark:将数据框中的双列转换为日期时间列

    我正在尝试编写代码来将日期时间列 date 和 last updated date 转换为 mm dd yyyy 格式以进行显示 它们实际上是 unix 时间转换为双精度数 我该怎么做呢 import org joda time impor
  • Scala Eclipse 自动完成功能损坏?

    我正在尝试让自动完成功能在 Eclipse 中用于 Scala 开发 我试图从 Scala 类引用 java 类 但自动完成功能从未找到它 例如 以这个 scala 类为例 object Main def main args Array S
  • 如何在不进行硬编码的情况下使用 Cake 模式进行依赖注入?

    我刚刚阅读并享受蛋糕图案文章 http jonasboner com real world scala dependency injection di 然而 在我看来 使用依赖项注入的关键原因之一是您可以改变 XML 文件或命令行参数所使用
  • 使用新的反射API,如何找到类的主构造函数?

    您可以像这样获取类的所有构造函数 import scala reflect runtime universe val ctor typeOf SomeClass declaration nme CONSTRUCTOR asTerm alte
  • 选择排序通用类型实现

    我以自己的方式实现了选择和快速排序的递归版本 我试图以一种可以对任何泛型类型的列表进行排序的方式修改代码 我想假设提供的泛型类型可以转换为 Comparable at运行 有人有关于如何执行此操作的链接 代码或教程吗 我正在尝试修改这个特定
  • Scala:折叠与折叠左

    我试图了解fold 和foldLeft 以及各自的reduce 和reduceLeft 如何工作 我使用 Fold 和 FoldLeft 作为示例 scala gt val r List ArrayBuffer 1 2 3 4 10 sca
  • IntelliJ、Akka 和配置文件

    使用时akka http akka io 我放置akka conf in src main resources 当我run通过 sbt akka conf被正确识别 但当我运行 IntelliJ 时却没有 即使在gen idea 实现这一目
  • 将 Seq 与 Range 进行模式匹配

    考虑一段代码 def foo xs Seq Int xs match case Nil gt empty list case head Nil gt one element list case head tail gt s head is
  • 我应该将 scala-compiler 作为依赖项包含在 build.sbt 中吗?

    我正在尝试在 intellij 中使用 scala 2 11 7 构建一个项目 我已经设置了scalaVersion to 2 11 7 但是当我检查外部库时 我可以看到scala compiler 2 11 0 我需要声明吗scala c
  • Scala 不可变 Map 速度慢

    当我创建地图时 我有一段代码 val map gtfLineArr 8 split map split collect case Array k v gt k v toMap 然后我使用这张地图来创建我的对象 case class MyOb

随机推荐