Является ли ненулевой объект из намерения? .Extras?NULLABLE? - PullRequest
0 голосов
/ 14 мая 2019

Предположим, что в Activity есть объект с ненулевым перечислением MainFlag (например, enum class MainFlag { PARAM1, PARAM2 }) от lateinit var:

private lateinit var flag: MainFlag

Далее, я получаю это позже в onCreate() как:

flag = intent?.extras?.getSerializable(ARG_FLAG) as MainFlag

и я использовал это flag в этом упражнении в нескольких местах с нулевыми проверками

flag?.let{
  //..
}

но потом Android Studio жалуется:

Ненужный безопасный вызов для ненулевого получателя типа MainActivity.Companion.MainFlag

Я не уверен, что использовать его без нулевых проверок, потому что, если intent?.extras? не пройден, флаг не будет установлен, то есть ноль?

Ответы [ 3 ]

4 голосов
/ 14 мая 2019

да, это может быть null. Вы получаете предупреждение, потому что вы понижаете число до типа Nullable

intent?.extras?.getSerializable(ARG_FLAG) as MainFlag

должно быть

intent?.extras?.getSerializable(ARG_FLAG) as? MainFlag
0 голосов
/ 14 мая 2019

Если вы уверены, что intent?.extras?.getSerializable(ARG_FLAG) никогда не будет null (а также ни один из промежуточных объектов: intent и intent.extras), тогда вы можете оставить все как есть и просто использовать flag.let { ... вместоflag?.let { ....

Если есть вероятность, что любой из них будет null, тогда вы должны использовать MainFlag? -тип для своего флага, например:

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

... или рискуйте TypeCastException при сохранении as MainFlag.

Причина, по которой Android Studio жалуется на ненужный безопасный вызов, состоит в том, что вы указали тип как ненулевой MainFlag (косвенно черезваш as MainFlag -каст).Так что, если вы получаете доступ к flag, он уже должен быть там, и он должен быть не нулевым (вы так сказали).Код, однако, завершится неудачно при приведении, если было задействовано null -значение, то есть приведение к типу, не допускающему обнуление, не могло быть успешным.

0 голосов
/ 14 мая 2019

Прежде всего вы должны объявить переменную как

private lateinit var flag: MainFlag?

или

private var flag: MainFlag? = null

, затем вы можете установить значение flag следующим образом

flag = intent?.extras?.getSerializable(ARG_FLAG) as? MainFlag

Теперь флаговая переменная nullable.Так что вам нужно проверять nullable везде в коде, как это:

flag?.let{
  //..
}
...