Почему стандартные реализации интерфейсов слушателя в Android Studio включают в себя родительский элемент, допускающий значение NULL? - PullRequest
1 голос
/ 31 марта 2019

Каждый раз, когда я реализую обязательный метод переопределения интерфейса слушателя в Android Studio (когда я использую CTRL + I, а не пишу его вручную), родительский объект всегда обнуляется.Например:

class Location : AppCompatActivity(), RadioGroup.OnCheckedChangeListener  {
    override fun onCheckedChanged(group: RadioGroup?, checkedId: Int) {
        TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
    }

Почему RadioGroup по умолчанию обнуляется?Если вызывается onCheckedChanged - не означает ли это, что RadioGroup не может быть нулевым?

1 Ответ

0 голосов
/ 01 апреля 2019

По причине того, что автоматически сгенерированная реализация ожидает обнуляемые аргументы, безопаснее ожидать обнуляемого типа от Java (для методов, определенных Java) для аргументов без @NonNull аннотации.Но для методов с аннотированными аргументами реализации будут генерироваться в соответствии с аннотацией.

Допустим, у нас есть интерфейс Java:

/**
 * Java interface
 */
public interface Callback {
    void invoke(Object undefined, @Nullable Object nullable, @NonNull Object nonNull);
}

И его реализация:

/**
 * Kotlin implementation
 */
class CallbackImpl : Callback {
    override fun invoke(undefined: Any?, nullable: Any?, nonNull: Any) {
        TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
    }
}

Как выКак видите, аннотации были распознаны, и мы имеем:

  • undefined - обнуляемый тип, но пользователь обязан определить нулевую безопасность для аргументов без аннотаций.Вы можете изменить тип на Any, если можете гарантировать нулевую безопасность.
  • nullable - обнуляемый тип, и вы не можете изменить его тип на ненулевой
  • nonNull - необнуляемый тип, и вы не можете изменить его тип.Несмотря на то, что это безопасно, вы не можете изменить тип для реализации, он отвечает за интерфейс

Прочитайте здесь о роли аннотаций в взаимодействии Java

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...