开发者学堂课程【Scala 核心编程-基础:值类型的强制转换】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/609/detail/8899
值类型的强制转换
目录
一、 强制类型转换
二、 课堂练习题
一、 强制类型转换
//理论上在讲完值类型的转换就应该讲解高级隐式转换和隐式函数。
高级隐式转换和隐式函数。
Scala 还提供了非常强大的隐式转换机制(隐式函数,隐式类等等),这里放在高级部分专门使用一个章节来进行讲解。
强制类型转换:
1. 介绍
自动类型转换的逆过程,将容量大的数据类型转换为容量小的数据类型。使用时要加上强制转函数,但可能造成精度降低或溢出,格外要注意。
//容量高低本质是在探讨能够表示的范围的数据的大小,比如说 int 可以表示的范围肯定没有一个 long 表示的范围大。还有 float 和 double,float 的小数点只能精确到大概6位,但是 double 的小数点可以保留到很多位,就说明精度的大小本质上就是范围的大小
//在使用强制转换的时候,造成了精度溢出,可能就会导致结果有一个小小的差距。在使用强制转换时,就需要考虑精度能否满足需求。
//强制类型转换不是属于隐式转换,隐式转换是编译器自动帮助完成
2. 案例演示
java:int num = (int)2.5 //直接使用语法的形式来进行转换
scala: var num : Int =2.7.toInt //scala 的特点是一切都是对象
3. 强制类型转换细节说明
(1)当进行数据的从大--->小,就需要使用到强制转换 //因为自动转换无法成功
(2)强转符号只针对于最近的操作数有效,往往会使用小括号提升优先级
例子:
val num1:Int = 10*3.5.toInt + 6 * 1.5.toInt
//toInt 只作用于3.5和1.5上,此案例结果为36
注意:toInt 是直接保留整数部分,不会进行四舍五入
v
al num2:Int = (10*3.5+6*1.5).toInt
//如果对整个结果进行 toInt 则需要先用括号包裹起来提高优先级,此案例结果为44
p
rintln(num1+””+num2)
执行代码:
p
ackage com.atguigu.chapter02.dataconvert
o
bject Demo02{
d
ef main(args:Array[String]):Unit = {
val num1:Int = 10*3.5.toInt + 6 * 1.5.toInt
v
al num2:Int = (10*3.5+6*1.5).toInt
p
rintln(num1+””+num2)
}
}
运行结果如下:
D:\program\jdk8\bin\java…
36 44
Process finished with exit code 0
(3)Char 类型可以保存 Int 的常量值,但不能保存 Int 的变量值,需要强转。
例子:
val char1 : Char = 1
//会先判断范围,如果范围正确则就不会出现错误,因为1可以将数据类型进行擦除
v
al num3 = 1
v
al char2 : Char = num3
//如果给 num3一个 char 类型,则会报错,因为编译器有变量的时候一定会有数据类型,所以此处错误
(4)Byte 和 Short 类型在进行运算时,当做 Int 类型处理。
二、 课堂练习题
值类型转换-课堂练习题:
判断是否能够通过编译,并说明原因:
(1)
var s : Short = 5
//将5给 short,正确
s
=s-2
//让此处的 s 再次减去2,错误。原因是 int-->short
(2)
var b:Byte=3 //把3给 byte,正确
b=b+4 //把 b 加4再给 b,错误。原因是 int-->byte
b=(b+4).toByte //使用强制转换,正确
(3)
var c:Char=’a’ //把 a 给 char,正确
var i:Int=5 //把 5给 int,正确
var d:Float=314F //正确,因为明确指定为 F
var result:Double=c+i+d //正确,相当于把 float 给 double 类型
(4)
var b:Byte=5 //把5给 byte 正确,因为没有数据类型
var s:Short=3 //正确
var t:Short=s+b //错误,因为整个运算结果为 int 类型,int-->short
var t2=s+b //正确,因为使用了类型推导,t2没有指定类型