Ошибка при преобразовании Java Lambda в Kotlin Lamba - PullRequest
0 голосов
/ 29 октября 2018

Я хочу использовать Fetch2 для загрузки файла в моем приложении, но я получил эту ошибку при попытке.

Пример кода на Java: [Из Эта ссылка ]

    fetch.enqueue(request, updatedRequest -> {
        //Request was successfully enqueued for download.
    }, error -> {
        //An error occurred enqueuing the request.
    });

Мой код [Kotlin].

    fetch.enqueue(request,
    success = { _: com.tonyodev.fetch2.Request ->
        TODO()        
    },
    failed = {  _: com.tonyodev.fetch2.Error ->
        TODO()
    })

Это ошибкакоторый я получил: image

Редактировать: я получил эту ошибку при компиляции моего кода.

None of the following functions can be called with the arguments supplied:
public abstract fun enqueue(request: Request, func: Func<Request>? = ..., func2: Func<Error>? = ...): Fetch defined in com.tonyodev.fetch2.Fetch
public abstract fun enqueue(requests: List<Request>, func: Func<List<Request>>? = ..., func2: Func<Error>? = ...): Fetch defined in com.tonyodev.fetch2.Fetch

Ответы [ 5 ]

0 голосов
/ 18 июня 2019

Самая короткая версия, которая работает

fetch.enqueue(request, Func {
    // success
}, Func {
   // failure
})
0 голосов
/ 29 октября 2018

Теперь я могу решить свою проблему, даже не знаю, как она работает.

    fetch.enqueue(request)
        Func<Request> { _ ->
            //TODO()
        }
        Func<com.tonyodev.fetch2.Error> { _ ->
            //TODO()

    fetch.enqueue(request,
        Func { _ ->
            //TODO()
        },
        Func { _ ->
            //TODO()
        })
0 голосов
/ 29 октября 2018

Вы проверили подпись и Javadoc из метода, который вы пытаетесь использовать здесь?

/**
     * Queues a request for downloading. If Fetch fails to enqueue the request,
     * func2 will be called with the error.
     * Errors that may cause Fetch to fail the enqueue are :
     * 1. No storage space on the device.
     * 2. Fetch is already managing the same request. This means that a request with the same url
     * and file name is already managed.
     * @param request Download Request
     * @param func Callback that the enqueued request will be returned on.
     *             Fetch may update a request depending on the initial request's Enqueue Action.
     *             Update old request references with this request.
     * @param func2 Callback that is called when enqueuing a request fails. An error is returned.
     * @throws FetchException if this instance of Fetch has been closed.
     * @return Instance
     * */
    fun enqueue(request: Request, func: Func<Request>? = null, func2: Func<Error>? = null): Fetch

/**
 * Queues a list of requests for downloading. If Fetch fails to enqueue a
 * download request because an error occurred, all other request in the list will
 * fail. Func2 will be called with the error message.
 * Errors that may cause Fetch to fail the enqueue are :
 * 1. No storage space on the device.
 * 2. Fetch is already managing the same request. This means that a request with the same url
 * and file name is already managed.
 * @param requests Request List
 * @param func Callback that the enqueued request will be returned on.
 *             Fetch may update a request depending on the initial request's Enqueue Action.
 *             Update old request references with this request.
 * @param func2 Callback that is called when enqueuing a request fails. An error is returned.
 * @throws FetchException if this instance of Fetch has been closed.
 * @return Instance
 * */
fun enqueue(requests: List<Request>, func: Func<List<Request>>? = null, func2: Func<Error>? = null): Fetch

Таким образом, второй и третий параметры являются в основном обратными вызовами, которые можно даже пропустить или вызвать что-то вроде fetch.enqueue (request, object: Func {// реализуем методы обратного вызова здесь }, ...)

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

В настоящее время при преобразовании Java SAMs в kotlin lambdas вы должны явно указывать тип. Итак, ваш код должен выглядеть примерно так:

fetch.enqueue(request,
    success = Func<Request> { _: com.tonyodev.fetch2.Request ->
        TODO()        
    },
    failed = Func<Error> {  _: com.tonyodev.fetch2.Error ->
        TODO()
    })
0 голосов
/ 29 октября 2018

попробуйте

  fetch.enqueue(request,
    success = { 
        TODO()        
    },
    failed = { 
        TODO()
    })

надеюсь, что это поможет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...