Failsafe withFallback():为什么 kotlin 编译器无法推断 lambda 类型?

Failsafe withFallback(): why kotlin compiler fails to infer lambda type?

我的 kotlin 代码中有以下内容:

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

Kotlin 编译器抱怨:

Error:(89, 14) Kotlin: Overload resolution ambiguity:

public final fun withFallback(p0: (() -> Boolean!)!): SyncFailsafe! defined in net.jodah.failsafe.SyncFailsafe

public final fun withFallback(p0: (() -> Unit)!): SyncFailsafe! defined in 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
        }

有人能解释一下为什么它不能与括号外的 lambda 文字一起使用吗?以及如何使其与 lambda 内联一起使用?

如果你写

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

您会看到它也可以编译(它只是丢弃结果)。所以 { -> false} 可以用于 () -> Boolean() -> Unit 两种类型,编译器不知道你想要哪个。

所以要使用 lambda,请在此处指定所需的类型:

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

或者创建一个没有重载的扩展函数,例如:

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

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