Котлин не проверяет оператор возврата в функции с некоторым типом возврата в сигнатуре функции - PullRequest
1 голос
/ 18 марта 2019
class TestReturnFunction{
fun convertIntToString(intVal:Int?):String{
    intVal?.let {
        return it.toString()
    }
}
}

В приведенной выше функции TestReturnFunction есть наивная функция, которая преобразует int в String. Внутри функции мы используем ключевое слово let, которое будет запускать блок кода только тогда, когда аргумент let не равен нулю. Таким образом, оператор return внутри let будет выполняться только тогда, когда аргумент не равен нулю.

Проблема с вышеприведенным заключается в том, что в случае, когда intVal имеет значение null, а оператор Android не выдает никаких ошибок, нет оператора return.

Если мы проверим документацию по ключевому слову let в kotlin, оно скажет:

Вызывает указанную функцию [блок] со значением this в качестве аргумента и возвращает ее результат.

Кроме того, проблема в том, что если мы рассмотрим байт-код Java для приведенного выше кода kotlin, он будет выглядеть следующим образом

public final class TestReturnFunction {
@NotNull
public final String convertIntToString(@Nullable Integer intVal) {
  if (intVal != null) {
     int it = ((Number)intVal).intValue();
     return String.valueOf(it);
  } else {
     return null;
  }
 }
}

Теперь проблема этого кода состоит в том, что функция возвращает ноль в случае, если intVal имеет значение ноль, но тип возвращаемого значения функции не имеет значения NULL. Это ошибка или особенность? кто-нибудь сталкивался с этой проблемой раньше?

1 Ответ

2 голосов
/ 18 марта 2019

Это известная ошибка, которая присутствовала в Kotlin версии 1.3.0.

см. https://youtrack.jetbrains.com/issue/KT-28061

Если возможно обновление до версии Kotlin> = 1.3.20

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...