来自intent.extras的非null对象吗?无效



假设,在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(也不是中间对象:intentintent.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值,即对不可用类型的铸件将无法成功。

,该代码将失败。

相关内容

  • 没有找到相关文章

最新更新