Scala的层次结构映射到Java

时间:2014-10-12 19:23:02

标签: scala oop

正如“Scala中的编程:一个全面的分步指南”所述,在Scala中没有基本类型值,只有对象:整数是Int个实例,双精度是Double个实例。我假设这些类映射到Java的IntegerDouble ...类,因此映射为Object子类。

在本书中,提供了以下类型层次结构(类作为类型):

enter image description here

显示此图表后的几页,您可以阅读:

enter image description here

让我感到困扰的是:如果Scala的Double映射到Java的Double,这是java.lang.Object的规范,而AnyRefjava.lang.Object的别名同样,AnyVal不应该是AnyRef的子类吗?

修改

之后的几页我读到原始类型没有映射到Java的原始类型包装类,除非它们需要“盒装”版本;但我仍然感到困惑,因为在我看来并非所有Scala的对象都是java.lang.Object sublcasses实例。那就是:Scala中的类可能无法在JVM中作为Object子类进行翻译。

1 个答案:

答案 0 :(得分:1)

Java不仅具有扩展java.lang.Object(又名scala.AnyRef)的类型,而且具有原始类型,例如intdoubleboolean,...在Scala中,您可以在scala.Any下找到它们。因此scala.Int对应于Java int。不是java.lang.Integer;直到装箱发生时,JVM上的一种机制才能将原语传递给泛型方法。 Java和Scala都执行自动装箱,即在需要引用时围绕基本类型构造引用。

Scala的不同之处在于,scala.IntString有任何不同之处,与类型是否对应于JVM原语并不重要。您可以在scala.Int上调用方法,就好像它是任何常规对象一样。在字节码中,您仍然会有原始类型。

这就是为什么Scala有时被称为真正的或更纯粹的面向对象语言而不是Java。