В приведенном ниже примере я написал простое расширение декоратора, которое перехватывает исключения и возвращает 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 свойство: