前言
简单记录一下Kotlin中变量类型的转换,记录于此,方便自己查阅。
正文
如果将一种数据类型的值赋给另一种不同的数据类型的变量时,则需要进行数据类型转换。
根据转换方式的不同,数据类型转换可分为两种:智能类型转换和强制类型转换。
类型检查
在类型转换前,为了避免异常,可以通过is来进行类型检测。
is判断对象是否是某个类的实例。
!is判断对象不是某个类的实例、
var mString:Any = "谷歌一下" if (mString is String) { Log.d(TAG, "is String ") } else { Log.d(TAG, "is not String ") }
is String
mString是String的实例。
var mString:Any = "谷歌一下" if (mString !is Int) { Log.d(TAG, "is not Int ") } else { Log.d(TAG, "is Int ") }
is not Int
mString不是Int的实例。
智能类型转换
Kotlin编辑器可以自行判断对象类型,然后进行转换。
拿上面例子来说
var mString:Any = "谷歌一下" if (mString is String) { Log.d(TAG, "is String ") } else { Log.d(TAG, "is no String ") }
虽然mString定义为Any类型,但mString最终还是判断为String的实例。这个就是编辑器自动进行转换的。
所以在Kotlin中,我们可以省略定义的类型。比如
// Int类型变量 var mNumber = 1
编译器会自动推断为Int
强制类型转换
当在某些特殊情况下无法进行智能类型转换时,还可以进行强制类型转换。
通过as操作符进行强制类型转换。
open class Person { } class Student : Person() { }
var student = Student() var person = student as Person Log.d(TAG, "test 1 : $person ")
子类可以强转为父类
父类不可以强制为子类(抛出异常)。
并不是所有的都可以强制转换,不支持的会抛出异常。
var mInt = 1 var mString = mInt as String Log.d(TAG, "test: $mString")
运行后crash了
Caused by: java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String
如果不确定是否可以强制转换,可以使用as?
var mInt = 1 var mString = mInt as? String Log.d(TAG, "test: $mString")
输出结果
test: null
类型不兼容,使用 as? 运算符就会返回null。
参考文章
© 版权声明