请读者如果想起Scala是怎样的强类型和静态化语言的话,那么就能够明白通过特征来加入新功能的特
点给他带来了多大的灵活性。
Scala的类型体系(基本类型)
Scala中可使用的基本数据都以类的形式被定义了,所以基本类型与用户定义类型可以认为是没有区别的。虽然这么说,Scala还是提供了与Java的数据类型相对应的类定义群(图 4-1)。这绝不是包装类,在编译后他们将被映射为Java的字节码,所以性能上是绝对没有问题的。
图 4-1与Scala基本类型相对应的类群
如下例程序所示,对于整数对象7可以响应各种消息(方法)。既可以执行toString方法来转换成字符串,又可以使用to这个执行Int => Range的方法。附带说一下,7 to 20相当于7.to(20),该方法的执行结果是Range(7,8, 9, … 19, 20)。对于该范围对象适用了foreach( (i)=>print(i) ),print _则与一个参数的匿名函数(i) => print(i)相当。
|
实际上,Scala在编译器自动引入的Predef单例对象中定义了为了兼容Java基础类型所存在的类型别名。例如boolean, char, byte, short, int, long, float, double被定义了,这些别名实际上是引用了Scala.Boolean,Scala.Char,Scala.Byte等Scala的类。可能的话,为了提高“Scala中说所有数据都是对象”这种意识,建议尽量一开始就使用Int、Boolean、Float等原来的类名。
不过,在Scala种并没有类型转换操作符,而是在所有类的基类Any中定义了具有同等功能的方法asInstanceOf[X]。用这方法就可以把类型转换为X了。Any类中同时还定义了相当于instanceof操作符的isInstanceOf[X]方法。
图 4-2Scala类层次的基本结构
特别是该类层次中Iterable下的集类型在函数式编程中大显身手。其中的可变(mutable)与非可变(immutable)两大系列的类层次基本上呈现出镜像关系,可以充分发挥出函数式语言功能的当然就是非可变集类型群了。
结束语
这一讲以迷你旅行的形式说明了一下Scala语法的特点,函数定义和函数式编程就卖个关子放到下一讲去吧。