3.2 Java基本类型对应的Scala类
Java世界呈现出一个割裂的现象,有对象,有基本类型,比如int
、double
等。Scala把一切都视为对象。
Java把基本类型同对象区分对待。从Java 5开始,自动装箱可以为对象方法传递基本类型。然而,Java不支持在基本类型上调用方法,像这样:2.toString()
。
与之不同的是,Scala把一切都视为对象。也就是说可以在字面量上调用对象,就像调用对象方法一样。下面的代码创建了一个Scala的Int
实例,将其传给java.util.ArrayList
的ensureCapacity()
方法,这个方法需要传入一个Java基本类型int
。
ScalaForTheJavaEyes/ScalaInt.scala
class ScalaInt {
def playWithInt() {
val capacity : Int = 10
val list = new java.util.ArrayList[String]
list.ensureCapacity(capacity)
}
}
在上面的代码里②,Scala悄悄地把Scala.Int
当作Java的基本类型Int
。其结果是不会在运行时因为类型转换而带来性能损耗。
②可以定义成
val capacity = 10
,让Scala推演类型,但是也可以显式指定,说明与Javaint
的兼容性。
类似的魔法还有,对Int
调用类似于to()
这样的方法,比如,1.to(3)
或是1 to 3
。当Scala确定Int
无法满足要求时,就会悄悄地应用intWrapper()
方法把Int
转化③为scala.runtime.RichInt
,然后调用它的to()
方法。
③在7.5节“隐式类型转换”中探讨了隐式类型转换。
诸如RichInt,RichDouble
,RichBoolean
之类的类,叫做富封装类。这些类表示Java的基本类型和字符串,它们提供了一些便捷方法,可以在Scala类里使用。