类型也称为数据类型,它告诉编译器程序员使用的数据类型。例如,如果我们将一个值或变量初始化为整数,则编译器将释放4个字节的内存空间,并将保留32位带符号整数类型。
类型转换是将类型从一种转换为另一种的过程。例如,我们可以在Scala中将int类型转换为float类型。
但是这种转换不能是两种方式,并且是从某些类型派生的,即从一种类型转换为另一种类型是可行的,而相反的则不是。这是由于数据类型的大小不同,从较大的类型转换为较小的类型可能会导致数据丢失。
下图显示了可能的转换:
object myObject { def main(args: Array[String]) { val a : Int = 3421 println("a的值: " + a + " and its type is: " + a.getClass) val c = a / 4 //结果是855.25,但将转换为Int println("a / 4的值: " + c + " and its type is: " + c.getClass) }}
输出:
a的值:3421 它的类型是: int a / 4的值: 855 它的类型是: int
在上面的代码中,我们创建了一个值为3421的整数类型的值a ,然后将a除以4并将结果存储在值c中。该除法保留一个小数点值,但是由于隐式类型转换,它存储在整数类型中,这有两个损失。
通过使用显式转换来避免数据丢失,可以解决此问题,但是在某些情况下,这可能会导致过多的内存浪费。
显式类型转换是用户定义的类型转换,即用户将决定值/变量的最终数据类型。
值类型的类型转换可以直接完成,但对于引用类型,则需要asInstanceOf方法进行转换。
由于asInstanceOf方法是Any Class的具体方法,因此它也可以用于AnyVal对象和AnyRef对象的类型转换(对象转换)。
让我们看一下这两种方法的示例:
示例1:显式类型转换
object myObject { def main(args: Array[String]) { // 类型从短到长的转换 val a : Short = 3421 println("有值: " + a + " 它的类型是: " + a.getClass) val b : Long = a // 将类型从短转换为长 println("Type casting from Short to Long") println("b具有值: " + b + " 它的类型是: " + b.getClass) // 从Char到Float的类型转换 val ch : Char = 'S' println("\nch has value: " + ch + " 它的类型是: " + ch.getClass) val fl : Float = ch // 将类型从Char转换为Float println("Type casting from Character to Float") println("fl具有值: " + fl + " 它的类型是: " + fl.getClass) } }
输出:
有值: 3421 它的类型是: short Type casting from Short to Long b具有值: 3421 它的类型是: long ch has value: S 它的类型是: char Type casting from Character to Float fl具有值: 83.0 它的类型是: float
在上面的代码中,我们完成了两种类型的转换。一个从short短到长long,另一个从char到float。
对于long到long,我们创建了short类型的变量a,存储了一个值3421,然后创建了另一个long类型的变量b,并使用short的值对其进行了初始化。
为了使char浮动,我们创建了char类型的变量ch,存储了值S,然后创建了另一个float类型的变量fl,并使用char的值对其进行了初始化。这将具有ASCII值“ S”的浮点类型。
示例2:使用asInstanceOf方法的显式转换
object myObject { def main(args: Array[String]) { // 从短型到短号的类型转换 val a : Short = 3421 println("有值: " + a + " 它的类型是: " + a.getClass) val b = a.asInstanceOf[Double] // 将类型从短转换为长 println("Type casting from Short to Double") println("b具有值: " + b + " 它的类型是: " + b.getClass) // 从Char到Int的类型转换 val ch : Char = 'S' println("\nch has value: " + ch + " 它的类型是: " + ch.getClass) val intVal = ch.asInstanceOf[Int] // 将类型从Char转换为Int println("Type casting from Character to Int") println("intVal具有值: " + intVal + " 它的类型是: " + intVal.getClass) } }
输出:
有值: 3421 它的类型是: short Type casting from Short to Double b具有值: 3421.0 它的类型是: double ch has value: S 它的类型是: char Type casting from Character to Int intVal具有值: 83 它的类型是: int
在上面的代码中,我们完成了两种类型的转换。一个从short到Double,另一个从char到int。
对于Double的short,我们创建了short类型的变量a,存储了一个值3421,然后我们创建了另一个Double类型的变量b,使用asInstanceOf方法将其初始化以进行类型转换。
对于char-to-float,我们创建了char类型的变量ch,它存储了一个值S,然后我们创建了另一个int类型的变量intVal,该变量使用asInstanceOf方法用char的值初始化。intVal中的数据是字符的ASCII值。