为什么 ?。尽管实例不可为空,但在调用方法时不可避免?

Why does ?. is inevitable when calling a method although instance isn't nullable?

我必须遵循以下变量声明:

var baseItemList: MutableList<BaseDataItem>? = null

写这行时:

baseDataItemsList?.get(position).getObjectTypeNum()

我收到一条错误消息:

Only safe (?.) or non-null asserted (!!.) calls are allowed on a nullable receiver of type BaseDataItem?

但是get 方法没有return BaseDataItem? ,只有一个BaseDataItem,因为括号内的BaseDataItem没有问号。 谁能解释一下这个错误,为什么我必须添加这个问号?

使用 Kotlins 作用域函数,例如 let 作用域来避免该警告:

baseDataItemsList?.let { baseDataItemList ->
  baseDataItemList.get(position).getObjectTypeNum()
}

这样您就可以断言 baseDataItemList 不能 nulllet 范围内。如果您想阅读有关该主题的更多信息,take a look into the documentation

查看这段代码:

baseDataItemsList?.get(position)?.getObjectTypeNum()

如果 baseDataItemsList 不为空,则调用 ?.get(position) return 的位置,否则 return 为空。因此,即使 baseDataItemsList.get() 会 return 一个不可为 null 的 BaseDataItem(只有在 baseDataItemsList 不可为空时才可以调用),null 安全的 baseDataItemsList?.get() 调用 return 是一个可为 null 的 BaseDataItem?,其中 null 条件表示 baseDataItemsList 为 null。所以你必须使用 ?.getObjectTypeNum() 来解释这一点。

旁注:在我看来,将 var 与可变集合相结合通常是一种代码味道,因为您正在以两种不同的方式制作可变的东西,这使得它更容易出错。