Spark 3.x大数据分析实战(视频教学版)
上QQ阅读APP看书,第一时间看更新

1.3.2 数据类型

在Scala中,所有的值都有一个类型,包括数值和函数。Scala的类型层次结构,如图1-4所示。

图1-4 Scala的类型层次结构

Any是Scala类层次结构的根,也称为超类或顶级类。Scala执行环境中的每个类都直接或间接地从该类继承。该类中定义了一些通用的方法,例如equals()、hashCode()和toString()。Any有两个直接子类:AnyVal和AnyRef。

AnyVal表示值类型,有9种预定义的值类型,分别是非空的Double、Float、Long、Int、Short、Byte、Char、Unit和Boolean。Unit是一个不包含任何信息的值类型,和Java语言中的Void等同,用作不返回任何结果的方法的结果类型。Unit只有一个实例值,写成()。

AnyRef表示引用类型,所有非值类型都被定义为引用类型。Scala中的每个用户定义类型都是AnyRef的子类型,AnyRef对应于Java中的Java.lang.Object。

例如,下面的例子定义了一个类型为List[Any]的变量list,list中包括字符串、整数、字符、布尔值和函数,由于这些元素都属于对象Any的实例,因此可以将它们添加到list中,代码如下:

    val list: List[Any] = List(
      "a string",
      732,  //an integer
      'c',  //a character
      true, //a boolean value
      () => "an anonymous function returning a string"
    )
       
    list.foreach(element => println(element))

上述代码的输出结果如下:

    a string
    732
    c
    true
    <function>

Scala中的值类型可以按照图1-5的方式转换,且转换是单向的。

图1-5 Scala值类型转换

例如下面的例子,允许将Long型转换为Float型,Char型转换为Int型:

下面的转换是不允许的:

    val x: Long = 987654321
    val y: Float = x  //9.8765434E8
    val z: Long = y  //不符合

此外,Scala还可以将引用类型转换为其子类型。

Nothing是所有类型的子类,在Scala类层级的最低端。Nothing没有对象,因此没有具体值,但是可以用来定义一个空类型,类似于Java中的标示性接口(如Serializable,用来标识该类可以进行序列化)。举个例子,如果一个方法抛出异常,异常的返回值类型就是Nothing(虽然不会返回)。

Null是所有引用类型的子类,所以Null可以赋值给所有的引用类型,但不能赋值给值类型,这个和Java的语义是相同的。Null有一个唯一的单例值null。