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}...
我的 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}...