3.2 Java基本类型对应的Scala类

Java世界呈现出一个割裂的现象,有对象,有基本类型,比如intdouble等。Scala把一切都视为对象。

Java把基本类型同对象区分对待。从Java 5开始,自动装箱可以为对象方法传递基本类型。然而,Java不支持在基本类型上调用方法,像这样:2.toString()

与之不同的是,Scala把一切都视为对象。也就是说可以在字面量上调用对象,就像调用对象方法一样。下面的代码创建了一个Scala的Int实例,将其传给java.util.ArrayListensureCapacity()方法,这个方法需要传入一个Java基本类型int

ScalaForTheJavaEyes/ScalaInt.scala

  1. class ScalaInt {
  2. def playWithInt() {
  3. val capacity : Int = 10
  4. val list = new java.util.ArrayList[String]
  5. list.ensureCapacity(capacity)
  6. }
  7. }

在上面的代码里②,Scala悄悄地把Scala.Int当作Java的基本类型Int。其结果是不会在运行时因为类型转换而带来性能损耗。

②可以定义成val capacity = 10,让Scala推演类型,但是也可以显式指定,说明与Java int的兼容性。

类似的魔法还有,对Int调用类似于to()这样的方法,比如,1.to(3)或是1 to 3。当Scala确定Int无法满足要求时,就会悄悄地应用intWrapper()方法把Int转化③为scala.runtime.RichInt,然后调用它的to()方法。

③在7.5节“隐式类型转换”中探讨了隐式类型转换。

诸如RichInt,RichDoubleRichBoolean之类的类,叫做富封装类。这些类表示Java的基本类型和字符串,它们提供了一些便捷方法,可以在Scala类里使用。