可以检查可空类型并将其强制转换为非可空类型,但反过来操作则相当困难。
例如:
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?>
,即使String
是String?
的子类。要使其工作,您应该
- 使用列表,它们是协变的:
var var1: Array<String?> = arrayOfNulls(10)
var var2: List<String> = var1.filterNotNull()
var var3: List<String?> = var2 // Now works
- 将数组转换为可空数组,如您所做的:
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为空的情况下抛出错误,但这是不可能的,因为正如你所说的,它会经过空检查。
解决方案看起来像这样。
- 这是一种可能的解决方案,即将str2定义为可空字符串
str1 : String? = ""
str2 : String? = str1
str3 : String? = str2
- 另一个解决方案是,在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]
因为var3
和var2
引用同一个对象,这将null
放入Array<String>
中,然后将其作为不可空的String
检索。这显然破坏了null安全。
最好只"将数组强制转换为可空数组",就像您正在做的那样。如果你确信你的代码永远不会这样做。