Как Kotlin наследует методы из Java интерфейсов
Что проверяют
Понимаете ли вы, как соединяются две системы типов, и знаете ли про платформенные типы. Это главная практическая ловушка совместимости.
Как отвечать
Класс на Kotlin реализует интерфейс из Java обычным образом, через двоеточие, а методы помечаются override. Абстрактные методы Java становятся обязательными к реализации, а методы по умолчанию (default) наследуются как есть и переопределяются при необходимости.
Что важно назвать помимо синтаксиса:
- платформенные типы: у типов, пришедших из Java, компилятор не знает, допускают ли они
null, и обозначает их какString!. Проверок он не навязывает, поэтому ответственность на вас: либо объявляете параметр как допускающийnull, либо полагаетесь на аннотации@Nullableи@NotNullв исходном коде Java, которые Kotlin учитывает; - функциональные интерфейсы: интерфейс Java с единственным методом можно реализовать лямбдой прямо в месте использования, это работает из коробки;
- свойства и геттеры: пара
getNameиsetNameиз Java видна в Kotlin как свойствоname, поэтому переопределять при реализации интерфейса иногда нужно именно свойство, а не метод; - generic-типы: подстановочные знаки Java превращаются в проекции типов Kotlin, и при реализации сигнатура может выглядеть иначе, чем в исходном интерфейсе;
- аннотации совместимости:
@JvmOverloads,@JvmStatic,@JvmNameнужны, когда Java-код будет вызывать ваш Kotlin-класс, а не наоборот.
Где спотыкаются
Объявляют параметры как не допускающие null и получают исключение, когда Java передаёт туда null.
Не знают, что метод по умолчанию из Java наследуется без переопределения.
Путают реализацию интерфейса с наследованием класса: у класса в Kotlin по умолчанию стоит запрет на наследование, и его открывают словом open.