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

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


person Héctor    schedule 19.06.2018    source источник
comment
Несколько слов о терминологии: вы не хотите, чтобы компилятор вылетал из строя! Вы просто хотите, чтобы он выдал сообщение об ошибке. Компилятор выйдет из строя только в том случае, если в нем есть ошибка.   -  person DodgyCodeException    schedule 19.06.2018
comment
@DodgyCodeException Совершенно верно! ; D спасибо за разъяснения   -  person Héctor    schedule 19.06.2018


Ответы (1)


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

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

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

person Héctor    schedule 19.06.2018
comment
Вы потеряли возвращаемый тип в процессе (вероятно, опечатка) - person Zoe; 19.06.2018
comment
@Zoe На самом деле я возвращаю void (Unit) - person Héctor; 19.06.2018
comment
Вы указали Any в качестве возвращаемого типа в вопросе, просто хотели убедиться, что это не опечатка :) - person Zoe; 19.06.2018
comment
@Zoe Это было просто для пояснения, что, если есть тип возврата, компилятор cmplains. Но мой реальный код возвращает Unit. Спасибо, в любом случае - person Héctor; 19.06.2018