На безопасном приемнике типа допускаются только безопасные (?.) Или ненулевые (!!.) Вызовы. - PullRequest
1 голос
/ 25 февраля 2020

Проблема

Я проверяю на ноль, но получаю эту ошибку:

// testNullCheck.kt
fun isNullOrEmpty(list: List<Int>?): Boolean {
  if (list.isEmpty() || list == null ) {
    return true
  }else {
    return false
  } 
}

fun main(args: Array<String>) {
  val test: Boolean = isNullOrEmpty(
    listOf<Int>()
  )
  println(test)
}

Вывод компиляции:

leetcode/kotlin [master●] » kotlinr testNullCheck.kt
Compiling, please wait...
testNullCheck.kt:2:11: error: only safe (?.) or non-null asserted (fg.) calls are allowed on a nullable receiver of type List<Int>?
  if (list.isEmpty() || list == null ) {
          ^
1
2

Вопросы:

  • Почему компилятор жалуется?
  • Имеет ли значение порядок операндов оператора if?

Ответы [ 2 ]

2 голосов
/ 25 февраля 2020

Когда вы комбинируете условные выражения, они оцениваются слева направо. Поэтому перед вызовом isEmpty() необходимо сначала проверить значение null:

fun isNullOrEmpty(list: List<Int>?): Boolean {
  if (list == null || list.isEmpty()) {
    return true
  }else {
    return false
  } 
}

Обратите внимание, что оператор if является избыточным. Просто сделайте это:

fun isNullOrEmpty(list: List<Int>?): Boolean {
  return list == null || list.isEmpty()
}

Я изменил имя вашей функции, потому что оно было несовместимо с тем, что вы проверяете.

Кроме того, уже есть встроенная функция, которую вы можете вызывать в nullable списки:

fun main(args: Array<String>) {
  val list: List<Any>? = null
  val test1: Boolean = list.isNullOrEmpty()
  println(test1)
}
0 голосов
/ 25 февраля 2020

Я проверяю на ноль. Почему компилятор жалуется?

Ответ

Вы вызываете isEmpty () для чего-то, что может быть нулевым. Вы должны проверить, является ли оно нулевым, прежде чем вызывать функцию для объекта. Kotlin делает это, чтобы избежать NullPointerException s

// testNullCheck.kt
fun isNullOrEmpty(list: List<Int>?): Boolean {
  if (list == null || list.isEmpty()) {
    return true
  }else {
    return false
  } 
}

fun main(args: Array<String>) {
  val test: Boolean = isNullOrEmpty(
    listOf<Int>()
  )
  println(test)
}

Вывод компиляции:

leetcode/kotlin [master●] » kotlinr testNullCheck.kt
Compiling, please wait...
true
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...