重拾Kotlin(10)-类型的检查与转换

作者: 业志陈 | 来源:发表于2019-05-27 19:27 被阅读2次

    一、类型的检查与转换

    1.1、类型检查

    is 与 !is 操作符用于在运行时检查对象是否符合给定类型:

    fun main(args: Array<String>) {
        val strValue = "leavesC"
        parserType(strValue) //value is String , length : 7
        val intValue = 100
        parserType(intValue) //value is Int , toLong : 100
        val doubleValue = 100.22
        parserType(doubleValue) //value !is Long
        val longValue = 200L
        parserType(longValue) //unknown
    }
    
    fun parserType(value: Any) {
        when (value) {
            is String -> println("value is String , length : ${value.length}")
            is Int -> println("value is Int , toLong : ${value.toLong()}")
            !is Long -> println("value !is Long")
            else -> println("unknown")
        }
    }
    

    1.2、智能转换

    在许多情况下,不需要在 Kotlin 中使用显式转换操作符,因为编译器跟踪不可变值的 is 检查以及显式转换,并在需要时自动插入安全的转换

    例如,对于以下例子来说,当判断 value 为 String 类型通过时,就可以直接将 value 当做 String 类型变量并调用其内部属性

    fun main(args: Array<String>) {
        val strValue = "leavesC"
        parserType(strValue) //value is String , length : 7
    
        val intValue = 100
        parserType(intValue) //value is Int , toLong : 100
    
        val doubleValue = 100.22
        parserType(doubleValue) //value !is Long
    
        val longValue = 200L
        parserType(longValue) //unknown
    }
    
    fun parserType(value: Any) {
        when (value) {
            is String -> println("value is String , length : ${value.length}")
            is Int -> println("value is Int , toLong : ${value.toLong()}")
            !is Long -> println("value !is Long")
            else -> println("unknown")
        }
    }
    

    编译器会指定根据上下文环境,将变量智能转换为合适的类型

        if (value !is String) return
        //如果 value 非 String 类型时直接被 return 了,所以此处可以直接访问其 length 属性
        println(value.length)
    
        // || 右侧的 value 被自动隐式转换为字符串,所以可以直接访问其 length 属性
        if (value !is String || value.length > 0) {
    
        }
    
        // && 右侧的 value 被自动隐式转换为字符串,所以可以直接访问其 length 属性
        if (value is String && value.length > 0) {
    
        }
    

    1.3、不安全的转换操作符

    如果转换是不可能的,转换操作符 as 会抛出一个异常。因此,我们称之为不安全的转换操作符

    fun main(args: Array<String>) {
        parserType("leavesC") //value is String , length is 7
        parserType(10) //会抛出异常 ClassCastException
    }
    
    fun parserType(value: Any) {
        val tempValue = value as String
        println("value is String , length is ${tempValue.length}")
    }
    

    需要注意的是,null 不能转换为 String 变量,因为该类型不是可空的

    因此如下转换会抛出异常

        val x = null
        val y: String = x as String //会抛出异常 TypeCastException
    

    为了匹配安全,可以转换的类型声明为可空类型

        val x = null
        val y: String? = x as String?
    

    1.4、安全的转换操作符

    可以使用安全转换操作符 as? 来避免在转换时抛出异常,它在失败时返回 null

        val x = null
        val y: String? = x as? String
    

    尽管以上例子 as? 的右边是一个非空类型的 String,但是其转换的结果是可空的

    重拾 Kotlin 系列文章目录: 重拾 Kotlin

    相关文章

      网友评论

        本文标题:重拾Kotlin(10)-类型的检查与转换

        本文链接:https://www.haomeiwen.com/subject/itfwnqtx.html