前言

简单记录一下Kotlin变量类型的转换,记录于此,方便自己查阅。

正文

如果将一种数据类型的值赋给另一种不同的数据类型的变量时,则需要进行数据类型转换

根据转换方式的不同,数据类型转换可分为两种:智能类型转换强制类型转换

类型检查

在类型转换前,为了避免异常,可以通过is来进行类型检测。

  1. is判断对象是否是某个类的实例。

  2. !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 ")
  1. 子类可以强转为父类

  2. 父类不可以强制为子类(抛出异常)。

并不是所有的都可以强制转换,不支持的会抛出异常。

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。

参考文章

  1. 《Kotlin从基础到实战》

相关文章

暂无评论

none
暂无评论...