Failsafe withFallback (): почему компилятору kotlin не удается определить лямбда-тип? - PullRequest
0 голосов
/ 29 ноября 2018

В моем коде kotlin есть следующее:

return Failsafe.with<Boolean>(retryPolicy)
        // Here I want fall back to false
        .withFallback { -> false} // Does not work
        .get { ->
            publish(event)
            true
        }

Компилятор Kotlin жалуется, что:

Ошибка: (89, 14) Kotlin: Неопределенность разрешения перегрузки:

публичное финальное веселье с обратным вызовом (p0: (() -> Boolean!)!): SyncFailsafe!определено в net.jodah.failsafe.SyncFailsafe

публичное финальное веселье с обратным вызовом (p0: (() -> Unit)!): SyncFailsafe!определено в net.jodah.failsafe.SyncFailsafe

Но так это работает:

val fallback: () -> Boolean = { false }

return Failsafe.with<Boolean>(retryPolicy)
        // Here I want fall back to false
        .withFallback(fallback) // Works
        .get { ->
            publish(event)
            true
        }

Может кто-нибудь объяснить мне, почему он не работает с лямбда-литералом вне скобок?И как заставить его работать с лямбда-инлайн?

1 Ответ

0 голосов
/ 29 ноября 2018

Если вы напишите

val fallback: () -> Unit = { -> false }

, вы увидите, что он также компилируется (он просто отбрасывает результат).Так что { -> false} может использоваться для обоих типов () -> Boolean и () -> Unit, и компилятор не знает, какой вы хотите.

Таким образом, чтобы использовать лямбду, укажите там нужный тип:

.withFallback({ -> false} as () -> Boolean)

или создайте функцию расширения без перегрузки, например:

fun <T, F> FailsafeConfig<T, F>.withFallbackT(fallback: () -> T) = withFallback(fallback)

return Failsafe.with<Boolean>(retryPolicy)
    .withFallbackT { -> false}...
...