Ответ 1
К сожалению, тела функций, которые вы вызываете, включая встроенные функции, не используются для умных приведений и выводов обнуляемости.
В вашем коде мало что можно улучшить, и я хотел бы предложить только одно: вы можете использовать оператор Элвиса с функцией Nothing
для этих утверждений. Анализ потока управления учитывает ответвления, возникающие в Nothing
и выводит из этого обнуляемость:
fun failOnNull(): Nothing = throw AssertionError("Value should not be null")
val test: Foo? = foo()
test ?: failOnNull()
// 'test' is not-null after that
Это также может быть написано без функции: test?: throw AssertionError("...")
, потому что выражение throw
также имеет тип Nothing
.
Говоря о более общем случае сбоя утверждения, можно использовать функцию fail(...): Nothing
, которая также дает подсказку для анализа потока управления. JUnit Assert.fail(...)
не является функцией Nothing
, но вы можете найти ее в kotlin-test-junit
или написать свою собственную.
test as? SomeType ?: fail("'test' should be an instance of SomeType")
// smart cast works here, 'test' is 'SomeType'