Ошибка компиляции команды с закрытыми классами

С закрытыми классами вы можете использовать исчерпывающие выражения и опускать предложение else , когда выражение возвращает результат:

 sealed class SealedClass { class First : SealedClass() class Second : SealedClass() } fun test(sealedClass: SealedClass) : String = when (sealedClass) { is SealedClass.First -> "First" is SealedClass.Second -> "Second" } 

Теперь, если я должен добавить Third в SealedClass , компилятор будет жаловаться, что выражение expression в test() не является исчерпывающим, и мне нужно добавить предложение для Third или else .

Мне интересно, однако, если эта проверка также может быть применена, когда test() ничего не возвращает:

 fun test(sealedClass: SealedClass) { when (sealedClass) { is SealedClass.First -> doSomething() is SealedClass.Second -> doSomethingElse() } } 

Этот фрагмент не прерывается, если Third добавлен. Я могу добавить оператор return до того, when это произойдет, но это можно легко забыть и может сломаться, если тип возврата одного из предложений не является Unit .

Как я могу убедиться, что я не забываю добавлять ветку к моим предложениям?

Способ принудительного исполнения исчерпывающего, when должен сделать это выражение, используя его значение:

 sealed class SealedClass { class First : SealedClass() class Second : SealedClass() class Third : SealedClass() } fun test(sealedClass: SealedClass) { val x = when (sealedClass) { is SealedClass.First -> doSomething() is SealedClass.Second -> doSomethingElse() } // ERROR here // or when (sealedClass) { is SealedClass.First -> doSomething() is SealedClass.Second -> doSomethingElse() }.let {} // ERROR here } 

Воодушевляя ответ Воддана, вы можете создать свойство, называемое safe вы можете использовать:

 val Any?.safe get() = Unit 

Использовать:

 when (sealedClass) { is SealedClass.First -> doSomething() is SealedClass.Second -> doSomethingElse() }.safe 

Я думаю, что это дает более четкое сообщение, чем просто добавление .let{} или присвоение результата значению.


Существует открытый вопрос на трекер Kotlin, который считает, что поддерживает «запечатанное время».

Intereting Posts
Проблемы с настройкой комнаты Kotlin в Android Studio registerReceiver () показывает ошибку для перегруженного метода kotlin map based properties и Jackson не работают – делегируйте точки на другую карту, чтобы свойство карты Знак доллара в строках Kotlin – Лучший способ конвертировать Singleton DatabaseController в Android Преобразование Java Collection.toArray в kotlin Класс Android с контекстом в поле объекта в Котлине Ошибка " не может быть преобразована в JSON" при попытке создать объект JSON из String Как получить текущее имя файла класса в kotlin Kotlin: зачем мне инициализировать var с помощью пользовательского getter? Realm & Kotlin: DefaultRealmModuleMediator.java -> ошибка: недостижимый оператор Добавление вторичного конструктора к родительскому объекту неожиданно влияет на дочерние классы Kotlin – Почему эта функция не подходит для рекурсии хвоста? Kotlin: Выполнение функциональных параметров в теле вызывающего Динамически создавать элементы управления в android с помощью Kotlin