Я наткнулся на следующий код:
import io.reactivex.Observable
import io.reactivex.functions.BiFunction
import java.util.concurrent.TimeUnit
class ExpBackoff(
private val jitter: Jitter,
private val delay: Long,
private val unit: TimeUnit,
private val retries: Int = 0
) : Function<Observable<out Throwable>, Observable<Long>> {
@Throws(Exception::class)
override fun apply(observable: Observable<out Throwable>): Observable<Long> {
return observable
.zipWith(Observable.range(1, retries), BiFunction<Throwable, Int, Int> { _, retryCount ->
retryCount
})
.flatMap { attemptNumber -> Observable.timer(getNewInterval(attemptNumber), unit) }
}
private fun getNewInterval(retryCount: Int): Long {
var newInterval = (delay * Math.pow(retryCount.toDouble(), 2.0) * jitter.get()).toLong()
if (newInterval < 0) {
newInterval = Long.MAX_VALUE
}
return newInterval
}
}
расположен по адресу:
https://leandrofavarin.com/exponential-backoff-rxjava-operator-with-jitter
Этот код не компилируется. Эта строка неверна:
Function<Observable<out Throwable>, Observable<Long>>
Функция принимает только один аргумент. Я действительно смущен здесь. Человек, который написал статью, ясно указывает, что он написал этот код, и я предполагаю, что он работает или, по крайней мере, работал в то время, когда он написал его. Но я сомневаюсь, что Котлин изменил интерфейс для функции. Даже если я удаляю второй параметр, код не будет компилироваться, потому что функция apply не может быть переопределена, поскольку она не является частью интерфейса Function.
Как я могу исправить эту проблему?