Контракты Kotlin не работают для нулевой проверки в функции расширения
Я пытаюсь написать функцию расширения, которая возвращает значение, если значение неnull
или 0 и использовать контракт, чтобы гарантировать компилятору, что если я верну значение, отличное от нуля. Однако, похоже, он не работает с умным литьем. Он по-прежнему не будет компилироваться, когда я попытаюсь передать значение в функцию, которая принимает ненулевое значение .
Я пытался скомпилировать этот код, и он не работал. я ожидалid
быть умнымLong
от a поскольку договор гарантирует, что еслиisValidId
возвращаетсяtrue
затем прошел вLong?
не является нулевым.
Как видите, это свойство неизменно, поэтому я не думаю, что проблема в этом. Я также добавил еще немного кода ниже, потому что проблема связана с функциями расширения. Это работает, когда я передаю идентификатор в качестве традиционного параметра.
fun test() {
val id: Long? = null //5L
if (id.isValidID()) {
// It won't compile because the compiler says that id is a Long?
// instead of smart casting it to a Long. doWithId requires a Long.
doWithId(id)
}
}
fun doWithId(id: Long) {}
@OptIn(ExperimentalContracts::class)
fun Long?.isValidID(): Boolean {
contract { returns(true) implies (this@isValidID != null) }
return this != null && this != 0L
}
Спасибо!
РЕДАКТИРОВАТЬ: О! Это работает, когда это не функция расширения. Кто-нибудь знает, как я могу заставить работать функции расширения?
fun test() {
val id: Long? = null
if (isValidID(id)) {
// This compiles now that I pass ID as a param instead of
// passing it in an extension function.
doWithId(id)
}
}
fun doWithId(id: Long) {}
@OptIn(ExperimentalContracts::class)
fun isValidID(id: Long?): Boolean {
contract { returns(true) implies (id != null) }
return id != null && id != 0L
}