Kotlin可空类型传入非空参数要求函数时类型不匹配如何解决?
你之前的写法问题说明
if (type !== null) val conf = getConfFor(type)不生效,是因为conf的作用域仅限if代码块内部,外部无法访问,且你没有处理null分支,编译器无法保证后续逻辑里conf一定存在。type?.let { getConfFor(type) }得到的conf是可空类型,是因为如果type为null,整个表达式会返回null,编译器无法确保conf一定有值。
可行解决方案(按需选择)
场景1:你能确保调用myFunction时传入的type一定不为null
直接使用非空断言运算符!!,明确告诉编译器你确认该值非空:
fun myFunction(type: Type?) { val conf = getConfFor(type!!) // 后续直接使用非空的conf即可 }
注意:如果实际运行时传入了null,会直接抛出空指针异常,仅在上游调用逻辑可以保证type非空时使用。
场景2:type允许为null,且null场景下可以给出默认配置
使用Elvis运算符?:给null场景兜底,得到的conf天然是非空类型:
fun myFunction(type: Type?) { // type为null时返回你预设的默认配置 val conf = type?.let { getConfFor(it) } ?: defaultConf }
也可以用if表达式实现同样效果:
fun myFunction(type: Type?) { val conf = if (type != null) { getConfFor(type) } else { defaultConf } }
场景3:type为null属于非法参数,没有可兜底的默认值
在函数开头做非空校验,直接抛出异常终止执行,校验后编译器会自动将type智能转换为非空类型,后续所有使用都不需要额外处理:
fun myFunction(type: Type?) { // 为空直接抛出参数异常 type ?: throw IllegalArgumentException("参数type不能为null") // 后续type自动被识别为非空的Type类型,直接传入即可 val conf = getConfFor(type) }
也可以用if判断提前返回实现同样效果:
fun myFunction(type: Type?) { if (type == null) { // 也可以根据业务逻辑返回其他值终止函数执行 return } val conf = getConfFor(type) }
内容的提问来源于stack exchange,提问作者Leff
相关产品推荐
相关产品推荐

