我有一个函数,它接受Array<String?>:
fun doStuff(words: Array<String?>) {
// ...
}
Run Code Online (Sandbox Code Playgroud)
有没有办法可以传递Array<String>给这个函数?原样编译器给我一个"类型不匹配"错误.
private val SOME_WORDS = arrayOf("I", "want", "to", "use", "these")
doStuff(SOME_WORDS) // throws a type-mismatch error
Run Code Online (Sandbox Code Playgroud)
我希望尽可能避免做出SOME_WORDS一个arrayOf<String?>(...).
使用out-projected Array<out String?>:
fun doStuff(words: Array<out String?>) { /* ... */ }
Run Code Online (Sandbox Code Playgroud)
Kotlin 中的数组是不变的,这意味着Array<A>和Array<B>不是任何不同Aand的彼此的子类型B,包括Stringand String?,并且它们不能被分配和作为参数传递来代替彼此。
使用out-projectionArray<out String?>使函数不仅Array<String?>可以接受,还可以接受子类型为 的数组String?。基本上,由于类型是final,因此只有一种这样的子类型,并且它是String(非空的,没有?)。
图片来自:A Whirlwind Tour of the Kotlin Type Hierarchy)
因此,该功能也将接受Arrray<String>。但是您将无法将可为空的值放入数组中(这就是投影的工作方式),因此类型安全(和空安全)得以保留。