Kotlin向varargs可变参数传可空展开数组时如何优雅处理null报错
Kotlin 可空数组展开传参编译报错解决
报错原因
Kotlin 展开运算符 * 仅支持对非空数组类型做操作。原代码 *source?.toArrOfPairs() 中,安全调用符 ?. 会让整个表达式返回可空类型 Array<Pair<Any?, Any?>?>,不满足展开运算符的参数类型要求,因此触发编译错误。
实现方案
结合 Kotlin 标准库的空安全扩展,仅需简单改写即可同时覆盖两个业务场景,无需额外编写判空分支:
- 场景1:仅传入展开数组,source 为 null 时自动以空数组完成调用
改写代码:
逻辑效果:当trackEvent( *source?.toArrOfPairs().orEmpty() )source?.toArrOfPairs()返回 null 时,orEmpty()会自动返回空的键值对数组,展开后等价于无参调用trackEvent(),无额外参数传入。 - 场景2:固定参数+展开数组组合调用,source 为 null 时自动跳过展开参数
改写代码:
逻辑效果:当 source 为 null 时,展开部分的空数组不会传递任何额外参数,最终trackEvent( "time" to timeStr, *source?.toArrOfPairs().orEmpty() )trackEvent仅接收到预先声明的固定键值对,完全符合传参预期。
补充说明
用到的 orEmpty() 是 Kotlin 标准库为可空数组、集合提供的内置扩展方法,会在接收者为 null 时返回对应类型的空实例,全程由编译器做类型安全校验,不会引入空指针风险。
内容的提问来源于stack exchange,提问作者user1114
相关产品推荐
相关产品推荐

