所以我的代码是这样的

var items = arrayOfNulls<String>(20)

显然,我提到了<String>个,而不是<String?>个.在下一段代码中,我将一串字符串值添加到items变量,但当我将items变量转换为字符串列表时,我得到错误的类型不匹配,即items变量被检测为<String?>.这是我的转换代码.

val texts: List<String> = items.toList()

我可以将texts声明更改为List<String?>以避免错误,但这不是我想要的.我希望我的texts变量数据类型是List<String>.事实证明,导致的根本原因是我在items声明期间预期的null值,它将数据类型从<String>更改为<String?>.但是如何在不期望为空的情况下声明ampty数组?

推荐答案

arrayOfNulls函数的签名:

fun <reified T> arrayOfNulls(size: Int): Array<T?>

强制使用可为空的<T?>,无论您是否放置不带问号的类型.请注意,它返回Array<T?>,因此即使您传递的T不可为空,返回的数组也具有可为空的类型.

这完全合乎逻辑.它为您提供了一个包含空值的array.

"空"数组是长度为0的array.如果您想要一个长度非零但没有值的数组,则必须用空值填充.没有其他合乎逻辑的可能性.

这是数组的限制.您可能希望改用MuableList,或者如果您已经知道要放入数组中的内容,请使用接受初始化lambda的数组构造函数,以了解如何初始填充它.

对于您的特定情况,另一种解决方案可能是(是否适合取决于您正在做什么):

val texts: List<String> = items.filterNotNull()

Kotlin相关问答推荐

最好的方法来创建一个 map 在kotlin从两个列表

在intellij中使用kotlin符号和floordiv

数据流弹性模板失败,出现错误&未知非复合转换urn";

扩展属性委托给实例属性

Ktor 在 Heroku 上的 CORS 问题,但在本地没有

为什么 <= 可以应用于 Int 和 Long,而 == 不能?

使用调度程序运行异步 Kotlin 代码

为什么 Kotlin 在将协变类型参数转换为不变类型参数时会产生 Unchecked Cast 警告?

为什么这个 Kotlin 代码不起作用? (如果 str[index] 在列表中,则打印)

具有泛型类型的 Kotlin 密封接口不会为其子类型推断约束

Kotlin 有 array.indexOf 但我无法弄清楚如何做 array.indexOfBy { lambda }

变量后的Android问号

片段内的 Kotlin 按钮 onClickListener 事件

Kotlin:子构造函数如何使用其父构造函数的辅助构造函数?

Spring Boot:更改属性占位符符号

空对象引用上的 TransitionSet ArrayList.size()

使用导航组件在不同的图形之间导航

什么是 Kotlin 等价于 Class<?>

将字符串编码为Kotlin中的UTF-8

Kotlin flatMap - map