为什么 ?。尽管实例不可为空,但在调用方法时不可避免?
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 不能 null
在 let
范围内。如果您想阅读有关该主题的更多信息,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
与可变集合相结合通常是一种代码味道,因为您正在以两种不同的方式制作可变的东西,这使得它更容易出错。
我必须遵循以下变量声明:
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 不能 null
在 let
范围内。如果您想阅读有关该主题的更多信息,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
与可变集合相结合通常是一种代码味道,因为您正在以两种不同的方式制作可变的东西,这使得它更容易出错。