Kotlin笔记-008空类型安全

188 阅读2分钟

空类型安全

Kotlin 在定义对象时,分为可空类型,和不可空类型。

// 不可空类型
var str1:String = "Kotlin"
// 不可以赋值为null
// str1 = null
var size:Int = str1.length

// 可空类型
var str2:String? = null
// 可空类型调用后返回的是可空类型
var size2:Int? = str2?.length

可空类型与不可空类型的转换

var str3: String? = "Kotlin"
// 可空类型强转成不可空类型;谨慎使用,当为null时会报空指针异常
var size3: Int = str3!!.length

var str4: String? = "Kotlin"
// 安全调用;当为null时不会报空指针异常
var size4: Int? = str4?.length
// 使用elvis运算符,返回值为不可空类型
// 若第一个运算数不为null,运算结果就是第一个运算数
// 若第一个运算数为null,运算结果就是第二个运算数
var size5: Int = str4?.length ?: 0

// 不可空类型是可空类型的子类
// 不可空类型可以赋值给可空类型
var sum1:Int? = size5
// 可空类型不可赋值给不可空类型
// var sum2:Int = size4

平台类型

Kotlin 支持 Java/JavaScript/Native 等平台,当 Kotlin 与 Java 等混合使用时,Kotlin 使用的对象类型是平台类型。

比如在 Java 中声明一个返回值为 String 的方法:

public class Apple {
    public String useName(){
        return "Apple";
    }
}

Kotlin 调用:

var name = Apple().useName()

var size:Int = name.length

此时 name 这个变量,就是一个平台类型--String!。

Kotlin 不能分辨平台类型是否为 null,当返回为 null 时会空指针异常。

使用安全访问可以避免空指针异常,返回值为可空类型。

var name = Apple().useName()

var size:Int? = name?.length

当然,如果使用注解,则 Kotlin 可以识别为对应的可空/不可空类型。

使用 NonNull 注解:

// 使用 NonNull 注解,Kotlin会当成 String
public class Apple {
    @NonNull
    public String useName(){
        return "null";
    }
}

Kotlin 使用时:

var name:String = Apple().useName()

var size:Int = name.length

使用 Nullable 注解:

// 使用 Nullable 注解,Kotlin会当成 String?
public class Apple {
    @Nullable
    public String useName(){
        return "null";
    }
}

Kotlin 使用时:

var name:String? = Apple().useName()

var size:Int? = name?.length