如何将Array<String?>转为Array<String>?及解决数组类型不匹配报错
Kotlin Array<String?> 转 Array? 解决方案
嘿,这两个问题本质上都是处理Kotlin中可空元素数组到可空的非空元素数组的类型转换,我给你详细拆解下:
1. 通用场景:Array<String?> 转 Array?
因为 Array<String?> 里可能存在 null 元素,而 Array<String> 要求所有元素都非空,所以核心是先处理掉 null,再转换类型。这里有两种常用方式:
方式一:安全过滤(推荐)
通过 filterNotNull() 过滤掉所有 null 元素,再转成非空元素数组,最后用 takeIf 判断是否为空数组(为空则返回 null),完美匹配 Array<String>? 类型:
fun convertToNonNullableArray(nullableArray: Array<String?>): Array<String>? { return nullableArray .filterNotNull() .toTypedArray() .takeIf { it.isNotEmpty() } }
如果你的业务允许空数组(即空数组时不返回 null),可以去掉 takeIf 那行,直接返回 toTypedArray() 的结果即可——Kotlin里非空数组可以自动转成可空类型。
方式二:强制类型转换(不推荐,仅在确保无null时使用)
如果你能100%保证 Array<String?> 里没有任何 null 元素,可以直接强转,但这种方式不安全,一旦出现 null 会抛出 ClassCastException:
val nullableArray: Array<String?> = arrayOf("sunny", "cloudy") val nonNullableArray: Array<String>? = nullableArray as Array<String>
2. 你的业务场景:arrayOfNulls 结果转 Array?
你的代码里 arrayOfNulls<String>(weatherArray.length()) 返回的是 Array<String?>,和 parsedWeatherData: Array<String>? 类型不匹配,解决步骤如下:
正确示例代码
先填充数组元素,再过滤 null 转换类型:
val weatherArray = forecastJson.getJSONArray(OWM_LIST) // 先创建可空元素数组 val tempArray = arrayOfNulls<String>(weatherArray.length()) // 循环填充数据(这里假设getString不会返回null,如果可能返回null,要额外处理) for (i in 0 until weatherArray.length()) { tempArray[i] = weatherArray.getString(i) } // 转换为Array<String>?类型 parsedWeatherData = tempArray .filterNotNull() .toTypedArray() .takeIf { it.isNotEmpty() }
特殊情况:确保填充后无null的强制转换
如果你的JSON数据里每个元素都一定是字符串,不会出现null,也可以简化成强转:
val weatherArray = forecastJson.getJSONArray(OWM_LIST) parsedWeatherData = arrayOfNulls<String>(weatherArray.length()).apply { for (i in 0 until weatherArray.length()) { this[i] = weatherArray.getString(i) } } as Array<String>
但还是那句话,强转有风险,除非你能绝对保证数据的可靠性。
内容的提问来源于stack exchange,提问作者Hasan Ghamloush
相关产品推荐
相关产品推荐

