与Java对比
scala中的数据类型在java中都能找到对应的,他们之间最大的区别是scala中的数据类型全部都是对象,并没有类似于java原生类型这样的东西。
scala的基础数据类型分为值类型(AnyVal)与引用类型(AnyRef),他们都有一个共同的父类=>Any,引用类型都有一个共同的子类=>Null,所有类型都有一个共同的子类=>Nothing。
这张图表现了scala数据类型的两大特点:
- 同一数据类型
- 同一底层
特殊的数据类型
数据类型 | 特点 | 描述 |
---|---|---|
Any类型 | Any 是所有类型的超类型,也称为顶级类型 | 它定义了一些通用的方法如 equals、hashCode 和 toString |
Unit类型 | Unit 用来标识没有明确返回值的函数 | Unit只有一个实例值,() |
Null类型 | Null 是所有引用类型的子类型 | Null 主要是使得 Scala 满足和其他 JVM 语言的互操作性,但是几乎不应该在 Scala 代码中使用 |
Nothing类型 | Nothing 是所有类型的子类型,也称为底部类型。没有一个值是 Nothing 类型的。 | 它的用途之一是给出非正常终止的信号,如抛出异常、程序退出或者一个无限循环 |
在Scala中值类型和引用类型都是对象,不存在包装类这种东西。
隐式类型转换
类型转换遵循的规则和Java一致。
有多种类型的数据混合运算时,系统首先自动将所有数据转换成容量最大的那种数据类型,然后再进行计算。
例如:
val a:Double = 5.6
val b:Int = 3
val c = a+b
println(c.getClass.getSimpleName) //double
byte,short,char 他们三者可以计算,在计算时首先转换为int类型。
显示类型转换
将精度大的类型转换为精度小的类型,有可能发生精度的损失。
当进行数据的 从 大——>小,就需要使用到强制转换。
强转符号只针对于最近的操作数有效,往往会使用小括号提升优先级。
Char类型可以保存 Int的常量值,但不能保存Int的变量值,需要强转。
Byte和Short类型在进行运算时,当做Int类型处理。
例如:
val a:Double = 5.6
val b:Int = 3
val c = (a+b).toInt
println(c.getClass.getSimpleName) //Int