空指针安全和平台类型

任何在Java中的引用都可能是null,这将让Kotlin需要严格的空安全来处理来自Java的对象。Java申明的类型被Kotlin特殊的对待,并且被称为平台类型。空检查在这样的类型中是不严格的,因此对它们的安全保证与Java是一样的。

考虑如下代码示例:

val list = ArrayList<String>() // non-null (constructor result)
list.add("Item")
val size = list.size() // non-null (primitive int)
val item = list[0] // platform type inferred (ordinary Java object)

当我们调用这种平台类型的变量的方法时,Kotli并不会在编译时引起空错误,但是运行时调用可能会出错,因为Kotlin生成的空指针或断言来 阻止空指针的传递:

item.substring(1) // allowed, may throw an exception if item == null

平台类型是不可表式的,意味着它们不能被显示的书写。当一个平台值被赋值给了Kotlin变量时,我们可以依赖类型推断(变量可以有一个推论的平台类型,就像上述的item一样),或者我们可以选择我们期待的类型(可为空或不能为空的类型都行):

val nullable: String? = item // allowed, always works
val notNull: String = item // allowed, may fail at runtime

如果我们选择一个可为空的类型,编译器将会在表达式上发出一个断言。这避免了Kotlin的非空变量持有空指针。当我们传递平台值给Kotlin函数的非空值时也会生成断言。总之,编译器以最大的努力避免空指针的出现(尽管有时完全消除空指针是不可能的,因为泛型)。

results matching ""

    No results matching ""