代码之家  ›  专栏  ›  技术社区  ›  huynhjl bhericher

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

  •  97
  • huynhjl bhericher  · 技术社区  · 14 年前

    我通常会尝试每一个组合,直到编译完成。有人能解释一下我应该用什么吗?

    3 回复  |  直到 14 年前
        1
  •  127
  •   Community Egal    7 年前

    我不同意 Chris's answer Any , AnyRef AnyVal 上课。但由于JVM固有的局限性,它们在字节码中不会显示为类。

    java.lang.Object ,但原语是分开的,并且

    另一方面,在Scala,一切 一个对象,所有对象都属于一个类,它们通过方法进行交互。生成的JVM字节码并没有反映这一点,但这并没有使它们变得更弱,就像Java有泛型一样,即使字节码没有泛型。

    因此,在Scala中,所有对象都是 ,这包括Java所考虑的对象和Java所考虑的原语。Java中没有等价物,因为没有这样的统一。

    安瓦尔 在斯卡拉。直到Scala 2.10.0, 是密封的,程序员无法扩展它。看看.Net上的Scala会发生什么应该很有趣,因为仅互操作性就要求Scala至少识别用户定义的“原语”。

    也延伸 引用类型 ,相当于 java.lang.Object

    在Scala 2.9.x之前,用户无法扩展 任何 ,也没有从Java引用它们,但是 它们还可以在Scala中使用。具体而言,类型签名:

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

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

    不过,从Scala 2.10.0开始,用户可以扩展 安瓦尔

    • 如果一个类扩展 安瓦尔

    • 如果一个特征延伸 ,则可用于扩展的两个类 引用类型 安瓦尔 .

    PS:在我看来,Java很可能会遵循C#,允许使用“struct”原语,也可能是typedef,因为不使用它们的并行性很难实现良好的性能。

        2
  •  42
  •   Community Egal    7 年前

    看到这个了吗?页面文本中有一些java互操作性备注。 http://www.scala-lang.org/node/128

    Scala Class Heierarchy

        3
  •  5
  •   oxbow_lakes    14 年前

    Any AnyVal 我相信它们是scala的一部分 课程本身不是这样的吗 (以同样的方式 Nothing 是类型,而不是类)。不能从Java代码中显式使用它们。

    Object 我们会期待一个斯卡拉 任何 / AnyRef .