Возможно ли использовать это выражение для получения вложенного массива с помощью Retrofit? - PullRequest
0 голосов
/ 26 февраля 2020

В предыдущем вопросе некоторые пользователи прокомментировали как доступ к вложенному массиву, что это возможно:

fun getMovies(): Single<Response<List<Result>>>

Но каждый раз, когда я пытаюсь это реализовать, это дает мне сообщение об ошибке:

No type arguments expected for class Response

Это мой класс модели:

data class Response(
   val page: Int?,
   val total_results: Int?,
   val total_pages: Int?,
   val results: List<Result>
) {
   //@Entity
   data class Result(
       val popularity: Double?,
       val vote_count: Int?,
       val video: Boolean?,
       val poster_path: String?,
       val id: Int?,
       val adult: Boolean?,
       val backdrop_path: String?,
       val original_language: String?,
       val original_title: String?,
       val genre_ids: List<Int>?,
       val title: String?,
       val vote_average: Double?,
       val overview: String?,
       val release_date: String?
   )
}

Мой интерфейс API


package com.example.moviesapplication.model

import io.reactivex.Single
import retrofit2.http.GET

interface MoviesApi {
   @GET("/3/discover/movie?api_key=${apiKey}&language=en-US&sort_by=popularity.desc&include_adult=false&include_video=false&page=1")
   fun getMovies():  Single<List<Response.Result>>
}

Так что если кто-нибудь знает если указанное выражение возможно или что-то подобное, пожалуйста, дайте мне знать.

Ответы [ 2 ]

1 голос
/ 26 февраля 2020

Ваш класс Response не имеет общих параметров c, и именно на это указывает ошибка.

Вы можете вернуть Single<Response>, и массив всегда будет списком Result, у него нет динамических c типов.

0 голосов
/ 26 февраля 2020

Я думаю, что вы импортируете неправильный пакет, возможно вы импортируете Response из Okhttp вместо вашего Response data class, так как Response из OkHttp не хочет аргумент типа.

В то же время Если ваш ответ немного странный, ваш класс ответа не требует аргумента типа. Ваш ответ должен выглядеть примерно так:

fun getMovies():  Single<Response>

вместо

fun getMovies():  Single<Response<List<Result>>>

Я думаю, что это так, потому что вы путаете между Response из Retrofit, которым нужен аргумент типа [Response<T>] и ваш класс данных Response, который не нуждается в аргументе типа.


Рекомендовать

Я думаю, будет лучше, если ваш класс Response будет выглядеть как

data class Response<T>(
    val page: Int?,
    val total_results: Int?,
    val total_pages: Int?,
    val results: List<T> // or val results: T
)

Потому что, если у вас много ответов pf, у которых есть Base, например Response класс, но его результат имеет другую модель или список (что-то вроде List<ResultMovie> или List<...>). Вам нужно только передать T вашей базовой модели, например, Response<Result>. Вам не нужно повторять, чтобы объявлять Response каждый раз, когда у вас есть Базовая модель, подобная этой, и это также легче управлять или исправлять позже.

...