kotlin中类型检查和类型转换

is 和!is操作符,可以在运行时检查一个对象与一个给定的类型是否一致,或者使用与它相反的!is操作符

fun main(arg: Array<String>) {

    var a :Any= 1
    if (a is String) {
        print("是String")
    }
    if (a is Int) {
        print("是Int")
    }
}
fun main(arg: Array ) { var a :Any= 1 if (a is String) { print("是String") } if (a is Int) { print("是Int") } }

智能类型的转换

fun main(arg: Array<String>) {

    demo("5")

    var x :Any = "a"
    when(x){
        is Int-> print(x+1)
        is String-> print(x.length+1)
        is IntArray-> print(x.sum())
    }
}
fun demo(x:Any){
    if (x is String){
        print(x.length)//x 被自动转换为String类型
    }
}

//智能转换的前提条件:
//  1.局部的val变量:永远有效
//  2.val属性:如果属性是private的或者internal的或者类型检查处理与属性定义出现在同一个模块内,那么智能类型转换时有效的.对于opnefire属性,活存在自定义get方法
//      智能转换类型是无效的
//  3.局部的var变量:如果在类型检查语句与变量使用语句直接,变量没有被改变,而且它没有被lambda表达式捕获并在lambda表达式内修改它,那么智能类型转换时有效的
//  4.var属性:永远无效
fun main(arg: Array ) { demo("5") var x :Any = "a" when(x){ is Int-> print(x+1) is String-> print(x.length+1) is IntArray-> print(x.sum()) } } fun demo(x:Any){ if (x is String){ print(x.length)//x 被自动转换为String类型 } } //智能转换的前提条件: // 1.局部的val变量:永远有效 // 2.val属性:如果属性是private的或者internal的或者类型检查处理与属性定义出现在同一个模块内,那么智能类型转换时有效的.对于opnefire属性,活存在自定义get方法 // 智能转换类型是无效的 // 3.局部的var变量:如果在类型检查语句与变量使用语句直接,变量没有被改变,而且它没有被lambda表达式捕获并在lambda表达式内修改它,那么智能类型转换时有效的 // 4.var属性:永远无效

强制类型转换

fun main(arg: Array<String>) {
    var x :Any = "a"
    val i = x as Int
    print(i)
}
fun main(arg: Array ) { var x :Any = "a" val i = x as Int print(i) }

如果类型强制转换,而且类型不兼容,那么会抛类型转换异常,这是不安全的,不安全的类型转换使用中辍操作符as

为了避免抛异常.可以使用as? ,当类型转换失败时候回返回null,不再抛异常

is 和!is操作符,可以在运行时检查一个对象与一个给定的类型是否一致,或者使用与它相反的!is操作符 fun main(arg: Array ) { var a :Any= 1 if (a is String) { print("是String") } if (a is Int) { print("是Int") } } 智能类型的转换 fun main(arg: Array ) { demo("5") var x :Any = "a" when(x){ is Int-> print(x+1) is String-> print(x.length+1) is IntArray-> print(x.sum()) } } fun demo(x:Any){ if (x is String){ print(x.length)//x 被自动转换为String类型 } } //智能转换的前提条件: // 1.局部的val变量:永远有效 // 2.val属性:如果属性是private的或者internal的或者类型检查处理与属性定义出现在同一个模块内,那么智能类型转换时有效的.对于opnefire属性,活存在自定义get方法 // 智能转换类型是无效的 // 3.局部的var变量:如果在类型检查语句与变量使用语句直接,变量没有被改变,而且它没有被lambda表达式捕获并在lambda表达式内修改它,那么智能类型转换时有效的 // 4.var属性:永远无效 强制类型转换 fun main(arg: Array ) { var x :Any = "a" val i = x as Int print(i) } 如果类型强制转换,而且类型不兼容,那么会抛类型转换异常,这是不安全的,不安全的类型转换使用中辍操作符as 为了避免抛异常.可以使用as? ,当类型转换失败时候回返回null,不再抛异常
经验分享 程序员 微信小程序 职场和发展