Контракты 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
  }

0 ответов

Другие вопросы по тегам