正如“Scala中的编程:一个全面的分步指南”所述,在Scala中没有基本类型值,只有对象:整数是Int
个实例,双精度是Double
个实例。我假设这些类映射到Java的Integer
,Double
...类,因此映射为Object
子类。
在本书中,提供了以下类型层次结构(类作为类型):
显示此图表后的几页,您可以阅读:
让我感到困扰的是:如果Scala的Double
映射到Java的Double
,这是java.lang.Object
的规范,而AnyRef
是java.lang.Object
的别名同样,AnyVal
不应该是AnyRef
的子类吗?
修改
之后的几页我读到原始类型没有映射到Java的原始类型包装类,除非它们需要“盒装”版本;但我仍然感到困惑,因为在我看来并非所有Scala的对象都是java.lang.Object
sublcasses实例。那就是:Scala中的类可能无法在JVM中作为Object
子类进行翻译。
答案 0 :(得分:1)
Java不仅具有扩展java.lang.Object
(又名scala.AnyRef
)的类型,而且具有原始类型,例如int
,double
,boolean
,...在Scala中,您可以在scala.Any
下找到它们。因此scala.Int
对应于Java int
。不是java.lang.Integer
;直到装箱发生时,JVM上的一种机制才能将原语传递给泛型方法。 Java和Scala都执行自动装箱,即在需要引用时围绕基本类型构造引用。
Scala的不同之处在于,scala.Int
与String
有任何不同之处,与类型是否对应于JVM原语并不重要。您可以在scala.Int
上调用方法,就好像它是任何常规对象一样。在字节码中,您仍然会有原始类型。
这就是为什么Scala有时被称为真正的或更纯粹的面向对象语言而不是Java。