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)
否则,与任何其他方法一样,您必须使用安全调用运算符.
您可以为可为空的接收器类型创建扩展。在你的榜样,它必须是Any?代替Any这将不允许空,看文档:
可空接收器
请注意,可以使用可为空的接收器类型定义扩展。即使其值为
null,也可以在对象变量上调用此类扩展,并且可以检查this == null主体内部。这就是允许您toString()在 Kotlin 中调用而无需检查的原因null:检查发生在扩展函数内部。Run Code Online (Sandbox Code Playgroud)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() }
小心,因为:
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 分钟才意识到这一点……
| 归档时间: |
|
| 查看次数: |
2490 次 |
| 最近记录: |