Kotlin 1.3.61 не удается разрешить возвращаемый тип свойства расширения для литерала функции - PullRequest
0 голосов
/ 30 января 2020

В приведенном ниже примере я написал простое расширение декоратора, которое перехватывает исключения и возвращает null при любой ошибке. Проблема в том, что тип num1 и num2 выводится как R? вместо Double?:

val <R> (()->R).nothrow: (()->R?) get() = { try { invoke() } catch(ex: Throwable) { null } }

fun main() {
  val num1 = "42"::toDouble.nothrow()
  println(num1)
  val num2 = "english"::toDouble.nothrow()
  println(num2)
}

Вывод программы:

42.0
null

Но когда я напишите

num1!! + 3.14

Я получаю сообщение об ошибке:

Unresolved reference. None of the following candidates is applicable because of receiver type mismatch

Кандидатами являются все plus существующих операторов.

Декомпилированный java код nothrow расширение выглядит следующим образом:

@NotNull
public static final Function0 getNothrow(@NotNull Function0 $this$nothrow) {
    int $i$f$getNothrow = 0;
    Intrinsics.checkParameterIsNotNull($this$nothrow, "$this$nothrow");
    return (Function0)(new Function0($this$nothrow) {
       // $FF: synthetic field
       final Function0 $this_nothrow;

       @Nullable
       public final Object invoke() {
          Object var1;
          try {
             var1 = this.$this_nothrow.invoke();
          } catch (Throwable var3) {
             var1 = null;
          }

          return var1;
       }

       public {
          this.$this_nothrow = var1;
       }
    });
 }

Почему это так?


РЕДАКТИРОВАТЬ

Кажется, проблема в расширении l ie свойство:

enter image description here

enter image description here

1 Ответ

1 голос
/ 30 января 2020

Это исправлено, если вы добавите круглые скобки вокруг вызываемой функции:

val num1 = ("42"::toDouble.nothrow)()
println(num1)
val num2 = ("english"::toDouble.nothrow)()
println(num2)
num1!! + 3.14 // Does not fail

Если вы попытаетесь написать этот код в IDEA:

"42"::toDouble()

Он говорит:

Этот синтаксис зарезервирован для будущего использования; чтобы вызвать ссылку, заключите ее в скобки: (foo :: bar) (args)

Вот почему ваш код не работает. Ваш код более сложен, чем просто вызов ссылки, поэтому IDEA не может его обнаружить.

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