变量类型推断 3个月前

编程语言
119
变量类型推断

省去变量类型

在Kotlin中大部分情况你不需要说明你使用对象的类型,编译器可以直接推断出它的类型。代码示例

fun typeInference(){
    val str = "abc"
    println(str)
    println(str is String)
    println(str::class)
    println(str::class.java)

    // abc
    // true
    // class java.lang.String (Kotlin reflection is not available)
    // class java.lang.String

    val d = Date()
    println(d)
    println(d is Date)
    println(d::class)
    println(d::class.java)

    // Fri Jun 09 00:06:33 CST 2017
    // true
    // class java.util.Date (Kotlin reflection is not available)
    // class java.util.Date

    val bool = true
    println(bool)
    println(bool::class)
    println(bool::class.java)

    // true
    // boolean (Kotlin reflection is not available)
    // boolean

    val array = arrayOf(1,2,3)
    println(array)
    println(array is Array)
    println(array::class)
    println(array::class.java)

    // [Ljava.lang.Integer;@7b5eadd8
    // true
    // class [Ljava.lang.Integer; (Kotlin reflection is not available)
    // class [Ljava.lang.Integer;
}

所以,我们只需要依据要产生的变量类型填写var或val,其类型通常能够被推断出来。编译器能够检测到其类型,自动地完成类型转换。当然,我们也可以明确地指定变量类型。

但是,类型推断不是所有的。例如,整型变量Int不能赋值Long变量。下面的代码不能通过编译:

fun Int2Long(){
    val x:Int = 10
    val y:Long = x // Type mismatch
}

我们需要显式地调用对应的类型转换函数进行转换:

fun Int2Long(){
    val x:Int = 10
    //  val y:Long = x // Type mismatch
    val y: Long = x.toLong()
}

使用is运算符进行类型检测

is 运算符检测一个表达式是否某类型的一个实例。

如果一个不可变的局部变量或属性已经判断出为某类型,那么检测后的分支中可以直接当作该类型使用,无需显式转换:

fun getLength(obj: Any): Int? {
    var result = 0
    if (obj is String) {
        // `obj` 在该条件分支内自动转换成 `String`
        println(obj::class) //class java.lang.String
        result = obj.length
        println(result)
    }
    // 在离开类型检测分支后,`obj` 仍然是 `Any` 类型
    println(obj::class) // class java.lang.Object
    return result
}

测试类如下

@Test
fun testGetLength() {
    val obj = "abcdef"
    val len = variableVSValue.getLength(obj)
    Assert.assertTrue(len == 6)

    val obj2:Any = Any()
    variableVSValue.getLength(obj2)
}
image
EchoEcho官方
无论前方如何,请不要后悔与我相遇。
1377
发布数
439
关注者
2223613
累计阅读

热门教程文档

MyBatis
19小节
Rust
84小节
CSS
33小节
Typescript
31小节
Spring Boot
24小节