如何将非空类型传递给具有空参数的函数?



可以检查可空类型并将其强制转换为非可空类型,但反过来操作则相当困难。

例如:

str1: String? = ""
// if str1 not null
str2: String = str1
str3: String? = str2 // This works!

在我的例子中,我谈论的是一个具有数组参数的函数,其中的内容可以为空,但我想传递给函数的数组的内容是非空的。这行不通:

var var1: Array<String?> = arrayOfNulls(10)
var var2: Array<String> = var1.filterNotNull().toTypedArray()
var var3: Array<String?> = var2 // This does not work!

我的问题是如何做到这一点?

我可以将数组转换为可空数组,但我不确定这是否是正确的方法。

在Kotlin中,数组是不变的,这意味着给定类型的数组不能被赋值给其父类型的数组。这就是为什么你不能把Array<String>分配给Array<String?>,即使StringString?的子类。要使其工作,您应该

  1. 使用列表,它们是协变的:
var var1: Array<String?> = arrayOfNulls(10)
var var2: List<String> = var1.filterNotNull()
var var3: List<String?> = var2  // Now works
  1. 将数组转换为可空数组,如您所做的:
var var1: Array<String?> = arrayOfNulls(10)
var var2: Array<String> = var1.filterNotNull().toTypedArray()
var var3: Array<String?> = var2 as Array<String?>  // Now works
var str1: String? = ""
// if str1 not null
var str2: String = str1 ?: ""
var str3: String? = str2  

Try This, Here ?:表示检查值是否为空,如果不是null很好,但如果它为null,你可以设置一个默认值这就是为什么我使用默认值"。

我只能说,

//This value can hold null values 
str1: String? = ""
// if str1 not null, store values in str2
// so, now str2 holds NOT NULL VALUES
str2: String = str1
// Now by default since str2 is NOT NULL
// All the values being passed inside str2 will always be NOT NULL
// 
str3: String? = str2 // This does not work

str3只会在str2为空的情况下抛出错误,但这是不可能的,因为正如你所说的,它会经过空检查。

解决方案看起来像这样。

  1. 这是一种可能的解决方案,即将str2定义为可空字符串
str1 : String? = ""
str2 : String? = str1
str3 : String? = str2
  1. 另一个解决方案是,在str2上设置null检查,因为str2不是null, str3将默认为not null。
str1 : String? = ""
str2 : String = str1 ?: ""
str3 : String = str2

根据更新的问题,

// A list of nulls
var var1: List<String?> = listOf(null, null, null, null, null, null, null, null, null, null)
//Mutable List to hold not null values or filter out null values
var var2: MutableList<String> = mutableListOf()
for (i in var1) var2.add(i ?: "")
//var3 will always be not null
var var3: List<String?> = var2

目前似乎没有答案解释为什么数组是不变的(因此Array<String>不是Array<String?>的子类型)。如果

var var2: Array<String> = var1.filterNotNull().toTypedArray()
var var3: Array<String?> = var2 // This does not work!

工作,然后你可以做

var3[0] = null
val x: String = var2[0]

因为var3var2引用同一个对象,这将null放入Array<String>中,然后将其作为不可空的String检索。这显然破坏了null安全。

最好只"将数组强制转换为可空数组",就像您正在做的那样。如果你确信你的代码永远不会这样做。

最新更新