Kotlin аннотирует приемник функции расширения

Я хотел бы ограничить, какая функция расширения постоянного значения может быть вызвана. Например, такая функция, как:

@IdRes
fun <T : View> Int.find() = findViewById<T>(this)

Если это было вызвано по реальному идентификатору, все в порядке:

R.id.someView.find<TextView>() // ok

Но это должно привести к ошибке компиляции:

42.find<TextView>() // should be compile error

Поддерживается ли аннотирующий приемник расширений в Kotlin?


person xinaiz    schedule 03.07.2018    source источник


Ответы (1)


Как описано в документации, вы можете использовать следующий синтаксис:

fun @receiver:IdRes <T : View> Int.find() = ...

Однако обратите внимание, что компилятор Kotlin не знает о семантике аннотаций Android, поэтому их неправильное использование никогда не является ошибкой компиляции; это в лучшем случае неудавшаяся проверка ворса.

person yole    schedule 03.07.2018
comment
Это не выделяет вызов, когда используется R.color.colorPrimary.find() - person xinaiz; 04.07.2018
comment
Скорее всего, проверки lint не обрабатывают аннотации на приемнике. Вы можете зарегистрировать проблему в системе отслеживания проблем Android. - person yole; 04.07.2018