J'utilise Retrofit2 dans mon application et cela fonctionne très bien, mais j'essaie d'utiliser une seule interface pour toutes sortes de demandes de méthode GET en transmettant un modèle dynamique. Quand je l'essayer en utilisant le code suivant, il donne l'erreur lors de l'exécutionImpossible de rendre l'interface Retrofit2 générique pour tous les modèles
public interface LoadDataServiceTest<T> {
@GET
Call<T> getModel(@Url String url, @QueryMap Map<String, String> options);
}
Modèle:
public class ModelTest<T> {
@SerializedName("status")
private String status;
@SerializedName("message")
private String message;
@SerializedName("users")
private T data;
public String getStatus() {
return status;
}
public String getMessage() {
return message;
}
public T getData() {
return data;
}
}
Mais quand je crée un service comme suit, j'obtiens l'erreur. Comment puis-je le résoudre et quelle est la meilleure approche pour atteindre cet objectif.
LoadDataServiceTest<ModelTest<JsonArray>> service = retrofit.create((Class<LoadDataServiceTest<ModelTest<JsonArray>>>) (Class<?>) APIs.LoadDataServiceTest.class);
Map<String, String> parameters = new HashMap<>();
parameters.put("user_id",userId);
Call<ModelTest<JsonArray>> call = service.getModel(APIs.GET_USERS, parameters);
Erreur:
FATAL EXCEPTION: main Process: com.iu.colgatepalmolive, PID: 16808 java.lang.RuntimeException: Unable to start activity ComponentInfo{com.iu.colgatepalmolive/com.iu.hfl_ccp.LoginActivity}: java.lang.IllegalArgumentException: Method return type must not include a type variable or wildcard: retrofit2.Call for method LoadDataServiceTest.getModel at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2666) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2727) at android.app.ActivityThread.-wrap12(ActivityThread.java) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1478) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:154) at android.app.ActivityThread.main(ActivityThread.java:6121) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:889) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:779) Caused by: java.lang.IllegalArgumentException: Method return type must not include a type variable or wildcard: retrofit2.Call for method LoadDataServiceTest.getModel at retrofit2.ServiceMethod$Builder.methodError(ServiceMethod.java:720) at retrofit2.ServiceMethod$Builder.methodError(ServiceMethod.java:711) at retrofit2.ServiceMethod$Builder.createCallAdapter(ServiceMethod.java:224) at retrofit2.ServiceMethod$Builder.build(ServiceMethod.java:160) at retrofit2.Retrofit.loadServiceMethod(Retrofit.java:166) at retrofit2.Retrofit$1.invoke(Retrofit.java:145) at java.lang.reflect.Proxy.invoke(Proxy.java:813) at $Proxy5.getModel(Unknown Source)
Cochez cette case [https://github.com/square/retrofit/issues/2012] – santalu
En bref, ce n'est pas possible. Merci pour référence. –