Заставить компилятор выдавать ошибку, когда не все реализации покрыты выражением "когда"

Может быть, это абсурдный вопрос. У меня есть метод, который получает Command (закрытый класс) и возвращается Unit и я хочу, чтобы компилятор падал, все ли when филиалы не были реализованы:

sealed class Command
class FirstCommand : Command()
class SecondCommand: Command()

fun handle(cmd: Command) {
  when(cmd) {
    is FirstCommand -> //whatever     
  }
}

Код выше в порядке, но я бы хотел, чтобы он не компилировался.

Когда метод возвращает что-то отличное от Unitне компилируется:

fun handle(cmd: Command) : Any {
  when(cmd) { //error, when must be exhaustive and requires all branches
    is FirstCommand -> //whatever     
  }
}

Я хочу такое поведение, но ничего не возвращаю (Unit). Я понимаю, почему это происходит, но мне интересно, могу ли я как-то изменить свой код, чтобы добиться того, чего я хочу. Мне нужно прикрыть все Command реализации, не забывая никого, что может быть добавлено позже.

1 ответ

Решение

Решаемые. Я не знал, что ты можешь использовать return оператор, даже когда метод возвращает Unit:

fun handle(cmd: Command) {
  return when(cmd) {
    is FirstCommand -> //whatever     
  }
}

Теперь код выше не компилируется, потому что when нужны все ветки. Как раз то, что я хотел.

Другие вопросы по тегам