kotlin:扩展方法和null接收器

pio*_*rek 4 kotlin kotlin-extension

在lombok中,扩展方法obj.method()是一种语法糖SomeUtil.method(obj).它允许为objnull.

Kotlin扩展方法是静态解决的,因此我认为它与我编写时的语法糖相同

fun Any.stringOrNull() = this?.toString()
Run Code Online (Sandbox Code Playgroud)

我收到了关于非空接收器上不必要的安全呼叫的警告.这是否意味着我无法像使用lombok一样调用null对象上的扩展函数?

zsm*_*b13 11

如果您将其定义为可空类型的扩展,则可以在可空对象上调用它:

fun Any?.stringOrNull() = ...
Run Code Online (Sandbox Code Playgroud)

否则,与任何其他方法一样,您必须使用安全调用运算符.


s1m*_*nw1 7

您可以为可为空的接收器类型创建扩展。在你的榜样,它必须是Any?代替Any这将不允许空,看文档

可空接收器

请注意,可以使用可为空的接收器类型定义扩展。即使其值为null,也可以在对象变量上调用此类扩展,并且可以检查this == null主体内部。这就是允许您toString()在 Kotlin 中调用而无需检查的原因null:检查发生在扩展函数内部。

fun Any?.toString(): String {
    if (this == null) return "null"
    // after the null check, 'this' is autocast to a non-null type, so the toString() below
    // resolves to the member function of the Any class
    return toString()
}
Run Code Online (Sandbox Code Playgroud)


Ole*_*ndr 7

小心,因为:

fun Any?.toString(): String
Run Code Online (Sandbox Code Playgroud)

以下行为:

var obj: Any? = null

obj?.toString() // is actually null
obj.toString() // returns "null" string
Run Code Online (Sandbox Code Playgroud)

我花了 15 分钟才意识到这一点……