По причине того, что автоматически сгенерированная реализация ожидает обнуляемые аргументы, безопаснее ожидать обнуляемого типа от 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