Scala 类型转换

Scala中的类型

类型也称为数据类型,它告诉编译器程序员使用的数据类型。例如,如果我们将一个值或变量初始化为整数,则编译器将释放4个字节的内存空间,并将保留32位带符号整数类型。

在Scala中进行类型转换

类型转换是将类型从一种转换为另一种的过程。例如,我们可以在Scala中将int类型转换为float类型。

但是这种转换不能是两种方式,并且是从某些类型派生的,即从一种类型转换为另一种类型是可行的,而相反的则不是。这是由于数据类型的大小不同,从较大的类型转换为较小的类型可能会导致数据丢失。 

下图显示了可能的转换:

Scala |  型转换


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中。该除法保留一个小数点值,但是由于隐式类型转换,它存储在整数类型中,这有两个损失。

通过使用显式转换来避免数据丢失,可以解决此问题,但是在某些情况下,这可能会导致过多的内存浪费。

2)显式类型转换

显式类型转换是用户定义的类型转换,即用户将决定值/变量的最终数据类型。

值类型的类型转换可以直接完成,但对于引用类型,则需要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值。