Kotlin中如何让编译器识别标注@NonNull的Location参数实际可为空
解决方案
你可以通过两种方式实现该需求:
- 主动修改重写方法的参数类型为可空类型
Kotlin支持在重写Java接口方法时放宽参数的非空限制,你可以直接将onLocationChanged的参数声明为Location?,此时编译器会自动将该参数识别为可空类型,强制要求你做后续的空安全处理。如果修改后出现UNSAFE_OVERRIDE的编译警告,添加对应压制注解即可,示例代码如下:
object : LocationListener { @Suppress("UNSAFE_OVERRIDE") override fun onLocationChanged(location: Location?) { // 按可空类型做正常处理即可 location?.let { validLocation -> doSomethingWithLocation(validLocation) } } }
- 不修改方法签名,手动做空检查
如果你不想改动原有方法签名,可以压制编译器的"无意义空比较"警告,手动判断参数是否为空:
object : LocationListener { override fun onLocationChanged(location: Location) { @Suppress("SENSELESS_COMPARISON") if (location == null) { // 空参数场景自行处理,比如直接返回 return } doSomethingWithLocation(location) } }
注意:两种方案本质都是绕过Kotlin基于官方
@NonNull注解生成的隐式空校验,你必须自行处理空参数的分支逻辑,才能避免运行时崩溃。
内容的提问来源于stack exchange,提问作者Jacques.S
相关产品推荐
相关产品推荐

