使用 is 运算符时是否需要检查 null

tes*_*est 1 typechecking kotlin

我有一个可以为空的实例。狐狸的例子

var str: String? = null
Run Code Online (Sandbox Code Playgroud)

所以我需要检查 str 是否是字符串。如果我使用 is 运算符,是否需要检查 null。第一个选项:

if(str is String) {}
Run Code Online (Sandbox Code Playgroud)

第二个选项:

if(str != null && str is String) {} 
Run Code Online (Sandbox Code Playgroud)

请帮助我使用哪种方式更好?

Rai*_*dex 5

is运算符是安全的,如果您提供 null 实例,则返回 false

https://pl.kotl.in/HIECwc4Av

在某个地方,你必须进行 nullcheck。Kotlin 提供了许多强制非空的方法:

使用非空类型:

var nonNull : String = ""
var nullable : String? = "" // notice the ?

nullable = null // works fine!
nonNull = null // compiler error
Run Code Online (Sandbox Code Playgroud)

如果遇到可为空的类型,您可以使用let {} ?: run {}构造来解包它并使用不可为空的类型执行代码:

nullable?.let { // use "it" to access the now non-null value
    print(it)
} ?: run { // else
    print("I am null! Big Sad!")
}
Run Code Online (Sandbox Code Playgroud)

Kotlin 严格区分 nullableT?和 nonnull TT尽可能使用以避免空检查。

  • @testovtest,“is”运算符转换为“INSTANCEOF”字节码操作,它还会检查 null。在使用“is”之前检查 null 并没有真正的好处。 (6认同)