Kotlin 将不可空字符串数组作为可空字符串数组传递

Kotlin 将不可空字符串数组作为可空字符串数组传递,kotlin,Kotlin,我有一个接受数组的函数: 如果可能的话,我最好避免使用一些单词作为(…)的数组。您应该使用,因为泛型类型Array扩展了Any,而不是Kotlin中的数组,例如: // v--- use out type projection here fun doStuff(words: Array<out String?>) { // ... } //v---在此处使用out类型投影 fun doStuff(单词:数组){ // ... }

我有一个接受
数组的函数

如果可能的话,我最好避免使用
一些单词
作为(…)
数组。

您应该使用,因为泛型类型
Array
扩展了
Any
,而不是Kotlin中的
数组,例如:

//                        v--- use out type projection here
fun doStuff(words: Array<out String?>) {
   // ...
}
//v---在此处使用out类型投影
fun doStuff(单词:数组){
// ...
}

当在Kotlin中使用类似于
?在Java中扩展T
。而
字符串
是Kotlin中
字符串
的子集,因此
数组
扩展了Kotlin中的
数组
。正如您所看到的,继承关系图的左侧是继承

使用
数组

fundostuff(单词:数组){/*…*/}
,表示
数组

照片摄于:)


因此,该函数也将接受Arrray。但是您将无法将可为null的值放入数组(投影就是这样工作的),因此类型安全性(和null安全性)将被保留。

这里的问题是方差
String
是其可为空的友元
String?
的子类型,但在Kotlin中,这并不意味着
Array
Array
的子类型,因为数组是不变的。 (在Java中,情况并非如此,默认情况下数组是协变的)

如果你有一个像你这样的函数,它需要一个
Array
类型的参数,你只能传递
Array
,因此
Array
是不可能的!如果要使方法同时处理这些数组,请执行以下操作:

fun doStuff(words: Array<out String?>) {
    // ...
}
fundostuff(单词:数组){
// ...
}
这使得数组
协变,并且允许传递
数组
的子类型

请注意,只有像
get()
这样的函数才可用于这种“外投影”数组。参数
words
被称为
String?
生产者

如果您想了解更多信息,请查看官方网站:)

//                        v--- use out type projection here
fun doStuff(words: Array<out String?>) {
   // ...
}
fun doStuff(words: Array<out String?>) { /* ... */ }
fun doStuff(words: Array<out String?>) {
    // ...
}