个性化阅读
专注于IT技术分析

Kotlin智能投射

本文概述

我们在之前的教程中已经看到Kotlin可空类型和不可空类型如何声明可空类型。要使用此可空类型, 我们可以选择使用智能强制类型转换。智能强制转换是Kotlin编译器在if表达式中跟踪条件的功能。如果编译器发现变量不是可为null的类型的null, 则编译器将允许访问该变量。

例如:

当我们尝试在没有安全类型转换的情况下访问可为null的String类型时, 它将生成编译错误。

var string: String? = "Hello!"
    print(string.length) // Compile error

为了解决以上表达式, 我们将安全类型转换为:

fun main(args: Array<String>){
var string: String? = "Hello!"
    if(string != null) { // smart cast
print(string.length) // It works now!
    }
}

输出:

6

在使用is或!is检查变量时, 编译器会跟踪此信息并将变量内部转换为目标类型。如果is或!is返回true, 则在范围内完成此操作。

用于智能投射

fun main(args: Array<String>){
val obj: Any = "The variable obj is automatically cast to a String in this scope"
    if(obj is String) {
                // No Explicit Casting needed.
println("String length is ${obj.length}")
    }
}

输出:

String length is 64

使用!is进行智能投射

fun main(args: Array<String>){
val obj: Any = "The variable obj is automatically cast to a String in this scope"
    if(obj !is String) {
println("obj is not string")

    } else
    // No Explicit Casting needed.
println("String length is ${obj.length}")
}

输出:

String length is 64

根据以下条件进行智能铸造工作:

val变量始终是局部属性的方面。

如果val属性是私有属性或内部属性, 则在声明该属性的模块中执行检查。

如果在检查和使用之间未修改本地var变量, 则不会在修改它的lambda中捕获该变量。

赞(0)
未经允许不得转载:srcmini » Kotlin智能投射

评论 抢沙发

评论前必须登录!