在Kotlin中,一种类型的数值不会自动转换为另一种类型,即使另一种类型更大。
接下来我们定义两个变量一个int型的a并且进行赋值,一个定义long型的,并把a赋值给b,也就是吧int型的值赋值给long的变量看可不可以?
var a:Int = 4
var b:Long = a
上面的代码是编辑器中是标红的,提示类型不匹配,需要把b的类型由Long(64位)型修改成Int(32位)才行,当我把类型替换后,错误就消失了。从编辑器的代码中就可以看的出来,低位类型的值不能赋值给高位类型的变量,不过我们可以通过对象提供的方法我们显示转换把低位的值进行位提升就可以了,比如Int型转换成Long型
var a:Int = 4
var b:Long = a.toLong()
这样子a就可以通过调用toLong()方法后就可以直接赋值给类型是Long的b了。
Kotlin所有的数值类型都提供的相互转换的to方法了
- toByte() - 将字符串解析为带符号的字节数,然后返回结果。
- toShort() - 将 Int 值转换为Short。
- toInt() - 将字符串解析为Int数字并返回结果。
- toLong() - 将字符串解析为Long数字并返回结果。
- toFloat() - 将字符串解析为Float数字并返回结果。
- toDouble() - 将字符串解析为Double数字并返回结果。
- toChar() - 将Int值转换为Char。
上面的都是低位向高位转换,那反过来高位向低位转换呢?
var a:Long = 4
var b:Int = a
编辑器也会提示:类型不匹配
Kotlin: Type mismatch: inferred type is Long but Int was expected
实际也也是一样的,也是可以通过对应的to方法进行转换,但是在高位向低位转换的时候有可能会对数值进行截断,从而使数值发生变化导致错误,我们把一个Int型的a=8888转换Byte会如何呢
var a: Int = 888
var b: Byte = a.toByte()
println("a=" + a)
println("a.toByte()后赋值给b=" + b)
输入结果:
a=888
a.toByte()后赋值给b=120
a在转换的时候,由888变成了120,这个就是高位转换低位导致截断,假如a小于120就不会出现这种情况。被转换的值在转换后的范围内是没有被截断的可能的
Boolean是不能和任何类型进行相互转换的。
自动提升
并不是说类型不能自动转换提升,这个是需要一个前提的,前提是运算符,在类型参与了算术运算的时候会进行相应的类型提升的
var a: Int = 888
var b: Byte = 5
var c:Int = a+b
b在和a进行求和计算的时候会转换,b的实际类型是没有变化的