Невозможно переопределить функцию применения - PullRequest
0 голосов
/ 06 июня 2019

Я наткнулся на следующий код:

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.

Как я могу исправить эту проблему?

1 Ответ

1 голос
/ 06 июня 2019

Похоже, вам не хватает правильного Function импорта. Следующий код работает в моей IDE.

import io.reactivex.Observable
import io.reactivex.functions.BiFunction
import io.reactivex.functions.Function
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
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...