1

可以检查可空类型并将其强制转换为不可空类型,但反之则非常困难。

例如:

str1: String? = ""
// if str1 not null
str2: String = str1

str3: String? = str2 // This works!

在我的例子中,我说的是一个带有 Array 参数的函数,其中的内容可以为空,但我要传递给函数的 Array 的内容是不可为空的。这不起作用:

var var1: Array<String?> = arrayOfNulls(10)

var var2: Array<String> = var1.filterNotNull().toTypedArray()

var var3: Array<String?> = var2 // This does not work!

我的问题是如何使这项工作?

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

4

4 回答 4

2

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

  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
于 2021-10-21T09:31:59.857 回答
0
var str1: String? = ""

// if str1 not null
var str2: String = str1 ?: ""

var str3: String? = str2  

Try This, Here ?: 代表检查一个值是否为空,如果不为空则很好,但如果它为空,您可以在其中设置一个默认值,这就是我在其中使用默认值“”的原因。

于 2021-10-21T08:32:59.143 回答
0

我能说的是,

//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 定义为 Nullable 字符串
str1 : String? = ""

str2 : String? = str1

str3 : String? = str2
  1. 另一种解决方案是,将空检查放在 str2,因为由于 str2 不为空,所以 str3 默认为非空。
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
于 2021-10-21T09:12:57.013 回答
0

目前似乎没有任何答案可以解释为什么数组是不变的(因此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]

因为var3andvar2引用同一个对象,所以 this 放入nullanArray<String>然后将其作为 non-nullable 检索String。这显然破坏了零安全性。

如果您确定您的代码永远无法做到这一点,最好只“将数组转换为可空数组,就像您正在做的那样”。

于 2021-10-25T10:51:36.007 回答