假设,在lateinit var
的活动中,有一个非编号MainFlag
对象(例如enum class MainFlag { PARAM1, PARAM2 }
(:
private lateinit var flag: MainFlag
earton,我稍后在onCreate()
中得到了:
flag = intent?.extras?.getSerializable(ARG_FLAG) as MainFlag
我曾经在Null-Checks
的几个地方使用此活动中的flag
flag?.let{
//..
}
但随后Android Studio抱怨:
不必要的安全电话 mainActivity.companion.mainflag
我不确定没有null检查的情况下使用它,因为如果intent?.extras?
失败,则不会设置标志,因此null?
是的,它可以是 null
。您正在获取警告,因为您正在铸造不可否认的类型
intent?.extras?.getSerializable(ARG_FLAG) as MainFlag
应该是
intent?.extras?.getSerializable(ARG_FLAG) as? MainFlag
首先,您必须将变量声明为
private lateinit var flag: MainFlag?
或
private var flag: MainFlag? = null
然后您可以像以下
一样设置flag
的值 flag = intent?.extras?.getSerializable(ARG_FLAG) as? MainFlag
现在,标志变量为 nullable
。因此,您需要在代码中的任何地方检查nullable
:
flag?.let{
//..
}
如果您确定intent?.extras?.getSerializable(ARG_FLAG)
永远不会是null
(也不是中间对象:intent
和intent.extras
(,那么您可以按原样保留所有内容,并且只需使用flag.let { ...
而不是flag?.let { ...
。
如果其中任何一个是null
,则必须使用MainFlag?
-Type作为标志,例如:
private var flag : MainFlag? = null // having null in place basically makes the lateinit meaningless and rightfully lateinit does not allow nullable types
flag = intent?.extras?.getSerializable(ARG_FLAG) as? MainFlag
...或在保持as MainFlag
时冒着TypeCastException
的风险。
Android Studio抱怨不必要的安全呼叫的原因是,您将类型指定为不可用的MainFlag
(通过您的as MainFlag
-cast间接使用(。因此,如果您访问flag
,它一定已经存在,并且必须是不零的(您这么说(。但是,如果涉及 null
值,即对不可用类型的铸件将无法成功。