这是因为顶级函数run
接受任何Any
& Any?
。因此Kotlin 在运行时不会检查具有Null Receiver的扩展函数。
// v--- accept anything
public inline fun <T, R> T.run(block: T.() -> R): R = block()
事实上,内联函数run
是由 Kotlin 生成的,如果receiver
可以为nullable则没有任何断言,因此它更像是为 Java 代码生成的 noinline 函数,如下所示:
public static Object run(Object receiver, Function1<Object, Object> block){
//v--- the parameters checking is taken away if the reciever can be nullable
//Intrinsics.checkParameterIsNotNull(receiver, "receiver");
Intrinsics.checkParameterIsNotNull(block, "block");
// ^--- checking the `block` parameter since it can't be null
}
如果你想以安全的方式调用它,你可以使用safe-call 操作符?.
,例如:
val foo: String? = null
// v--- short-circuited if the foo is null
foo?.run { println("foo") }