首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将不可空字符串数组作为可空字符串数组传递。

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

Stack Overflow用户
提问于 2017-08-24 16:11:52
回答 2查看 1.8K关注 0票数 10

我有一个接收Array<String?>的函数

代码语言:javascript
复制
fun doStuff(words: Array<String?>) {
    // ...
}

有什么方法可以将Array<String>传递给这个函数吗?因为- is编译器给了我一个“类型错配”错误。

代码语言:javascript
复制
private val SOME_WORDS = arrayOf("I", "want", "to", "use", "these")

doStuff(SOME_WORDS) // throws a type-mismatch error

如果可能的话,我最好避免让SOME_WORDS成为arrayOf<String?>(...)

EN

回答 2

Stack Overflow用户

发布于 2017-08-24 16:30:56

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

如果像您这样的函数需要Array<String?>类型的参数,那么只能传递Array<String?>,因此Array<String>是不可能的!如果要启用方法也处理这些数组,请执行以下操作:

代码语言:javascript
复制
fun doStuff(words: Array<out String?>) {
    // ...
}

这使得数组words、协变Array<String?>的子类型被允许传递。

请注意,只有像get()这样的函数才能访问这样的“外投影”数组。参数words据说是生产者 of String?

如果您想了解更多关于它的信息,请查看官方的文档 :)

票数 4
EN

Stack Overflow用户

发布于 2017-08-24 16:19:42

您应该使用外型投影,因为泛型类型Array<String>在Kotlin中扩展Any而不是Array<String?>,例如:

代码语言:javascript
复制
//                        v--- use out type projection here
fun doStuff(words: Array<out String?>) {
   // ...
}

当在Kotlin中使用外型投影时,就像上有界通配符 ? extends T在Java中一样。String是Kotlin中String?的一个子集,因此Array<String>在Kotlin中扩展了Array<String?>。如您所见,继承图的左边是上有界通配符继承。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45866466

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档