Класс аннотации не проверяет ввод как enum в Kotlin - PullRequest
0 голосов
/ 15 мая 2018

Я бы хотел создать аннотацию вместо enum, использовать ее для , когда оператор

@Retention(AnnotationRetention.SOURCE)
@IntDef(SELECT.toLong(), WEAR.toLong(), BAND.toLong())
annotation class CurrentState

companion object {
    const val SELECT = 0
    const val WEAR = 1
    const val BAND = 2
} 

private fun handleFragment(@CurrentState state:Int) {
    val fragment:Fragment =
    when(state){
        SELECT -> SelectDeviceFragment.newInstance()
        WEAR -> ConnectWatchFragment.newInstance()
        BAND -> SelectDeviceFragment.newInstance()
    }

Насколько я понимаю, этот код должен помешать мне выполнить следующий код:

handleFragment(5)

и когда оператор не должен просить меня добавить else оператор, как ожидается из enum Что я делаю неправильно или неправильно понимаю?

Ответы [ 2 ]

0 голосов
/ 15 мая 2018

Аннотация @IntDef является частью платформы Android.Компилятор не знает какой-либо конкретной семантики этой аннотации и не может использовать ее для проверки исчерпываемости операторов when.

Более того, даже с аннотацией вы можете вызвать handleFragment(5).Такой код не будет ошибкой компилятора, он будет отображаться только как предупреждение lint.

0 голосов
/ 15 мая 2018

С https://discuss.kotlinlang.org/t/intdef-and-stringdef-not-being-checked-at-compile-time/7029:

Эта проверка выполняется не компилятором, а Android lint.Работа над тем, чтобы сделать Android Lint независимым от языка, ведется, но если я не ошибаюсь, вам понадобится более новая версия Android Studio для этого.

И Сообщение в блоге Android Studio 3.1 упоминает проверки lint для Kotlin как функцию (хотя и не говорится, поддерживается ли эта проверка специально).

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