如何解决在null引用上调用扩展函数时,没有NullPointerException
我对为什么在此代码中的任何地方都没有NullPointerException
感到困惑:
fun main() {
null.print()
}
fun <T> T.print() {
this.let { println(it) }
}
通过print
值调用扩展函数null
时,既没有编译器警告也没有异常,因为它是用不可为null的接收器类型定义的,并且在调用{{1}时也没有异常},即使let
也具有不可为null的接收者类型。是什么原因?
解决方法
对于扩展方法,kotlin提供了一种语法糖。当您调用扩展方法时,kotlin在这里所做的是在顶部提供包装器。这样,您就可以使用该调用者的实例。因此,当您调用null.print()
时,它基本上就是在下面调用print(null)
。
所以您可以想到以下功能
fun <T> T.print()
转换为
fun <T> print(T t)
相同之处在于,它是一种扩展方法,实际上是将null
参数传递给let
而不是在let
实例上调用null
。
请注意,我是Kotlin的新手,因此非常感谢任何纠正。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。