Я недавно ответил на связанный вопрос о разнице между assert
и require
. TL; DR: assert
не гарантирует выдачи исключения, но require
есть. В версии 1.3 он также использует контракты, что означает, что если метод возвращает значение, компилятор знает, что утверждение является правильным, и он может применить смарт-приведение, если применимо.
Это объясняет, почему assert
не делает этого; возвращение из утверждения не означает, что утверждение верно. С кодом, который у вас есть, он не выдаст исключение, если ea
не является истиной. Assert не будет запускать умный бросок, даже с 1.3.
check
и require
оба запускают умное приведение на 1.3 и выше (из-за контрактов), assert не делает (нет контрактов и нет гарантии, что оно фактически выдает исключение, если условие не выполнено).
Я нашел этот пост на форумах Kotlin, спрашивающий точно, кто вы. Контакты присутствовали довольно долго, но этот пост также подтверждает мои первоначальные предположения: пока присутствуют контакты, они не были готовы . Эффективно отключен, как упоминается во втором посте. Вот почему умный актерский состав не работает.
Однако в Kotlin 1.3 контракты были освобождены. Если вы обновитесь, вы увидите, что он работает (по крайней мере, для меня).
Полная поддержка контракта была добавлена в 1.3-M2 , который является предварительным выпуском для 1.3.