如何将非空类型传递给参数为可空类型的函数
问题根因
Kotlin中的数组是泛型不变的,和单个基础类型的可空/非空继承逻辑完全不同:
- 单个变量场景下,
String是String?的子类型,因此非空类型可以直接赋值给可空类型变量,也就是你最初示例中赋值生效的原因 - 数组场景下,
Array<String>和Array<String?>不存在父子继承关系,因此无法直接赋值
可行实现方案
方案1:生成新的可空类型数组(最推荐,类型安全)
通过展开运算符拷贝原数组,直接生成元素为可空类型的新数组,代码如下:
var var3: Array<String?> = arrayOf(*var2)
该方案会生成独立的新数组对象,后续对var3的修改不会影响原var2数组,完全符合Kotlin的类型安全要求,无任何潜在风险。你也可以用map写法实现相同效果:
var var3: Array<String?> = var2.map { it }.toTypedArray()
方案2:unchecked强转(仅适用于可控的只读场景)
如果你可以100%确认后续不会通过var3向数组中写入null元素,可以直接进行强转:
var var3: Array<String?> = var2 as Array<String?>
警告:该方式不会生成新数组,
var3和var2指向同一个数组对象。如果后续通过var3写入null值,会打破var2的非空类型约定,访问var2元素时会直接触发空指针异常,非必要不建议使用。
内容的提问来源于stack exchange,提问作者sd_master92
相关产品推荐
相关产品推荐

