Während ich versuchte, ein Problem zu lösen, schrieb ich eine Methode mit einem Typparameter, der weder in den Argumenten noch im Rückgabetyp erwähnt wird, nämlich eine <T> void authenticate(Credentials credentials)
Methode. Die einzige Abhängigkeit von T
ist im Methodenkörper (Details voraus). Also meine Frage ist: Wie ist dieser generische Typ gelöst? Ich konnte keinen anderen Beispielcode mit dieser Art von generischem Typparameter finden.Wie löst Java generische Typparameter auf, die nicht in der Methodendeklaration enthalten sind?
So ist der Körper dieser Methode
so etwas wie istpublic <T extends AuthResponse> void authenticate(Credentials credentials) {
Call<T> call = getAuthCall(credentials);
Response<T> response = call.execute();
// doSomething is an AuthResponse method
response.body().doSomething();
}
, die ein Verfahren mit nur einem allgemeinen Rückgabetyp aufruft, die so geht:
private Call<T extends AuthResponse> getAuthCall(Credentials credentials) {
if (credentials instanceof CredentialsA)
return (Call<T>) service.authenticate((CredentialsA) credentials);
else if (credentials instanceof CredentialsB)
return (Call<T>) service.authenticate((CredentialsB) credentials);
else
throw new IllegalArgumentException();
}
So sind die Typparameter der beiden Methoden scheinen verwandt zu sein. Aber ich konnte nicht verstehen wie. Auch die (Call<T>)
Besetzung scheint nicht wie eine schöne Lösung für mein Problem - service
ist eine Retrofit-Schnittstelle wie folgt aus:
public interface AuthServiceInterface {
@POST("auth/a") Call<AuthResponseA> authenticate(CredentialsA credentials);
@POST("auth/b") Call<AuthResponseB> authenticate(CredentialsB credentials);
}
einfache Antwort - Java resove es nicht, wenn Sie es entfernen und T mit AuthResponse ersetzen - nichts wird sich ändern –