2017-03-21 4 views
1

Ich brauche etwas Hilfe mit Generics, das Ziel ist es, eine onSuccess/onError Callbacks, die ein Objekt als Argumente erhalten, der Objekttyp wird beim Erstellen der anonymen Klasse, die die onSuccess umschließt gesetzt/onFehlerfunktionen.Funktion Argument Generika in anonyme Klasseninstanz

Die Schnittstelle

public interface OnDataResponse<T> { 
    void onSuccess(T response); 
    void onError(String data, ResponseError error); 
} 

Der Aufruf, der den Hörer erzeugt, das Argument Typ onSuccess Einstellung CreateUserResponse

createUser(new Operation.OnDataResponse<CreateUserResponse>() { 
    @Override 
    public void onSuccess(CreateUserResponse response) { 

    } 

    @Override 
    public void onError(String data, ResponseError error) { 
    } 
};) 

Umsetzung create()

public void createUser(OnDataResponse responseListener) { 

      //performing the task asynchronously 
      String data 
      // if successfull, create an object of type T 
      //(CreateUserResponse in this case) 
      // try to parse data from json to object 
      //create instance of T 
      T tInstance = new Gson().fromJson(data, type); 

      // call the listener, providing the expected object 
      responseListener.onSuccess(tInstance) 
} 

sein T ist undefiniert in Seite createUser()

Irgendwelche Vorschläge zur Verbesserung und zum Funktionieren?

+0

Versuchen Sie es mit der folgenden Signatur: 'public Leere create (OnDataResponse Response, Klasse Typ)'. – sp00m

Antwort

3

Sie sollten Typ in Verfahren liefern oder wahrscheinlich besser in OnDataResponse wenn es dort verwendet werden können:

public <T> void createUser(Class<T> type, OnDataResponse responseListener) { ... } 
+0

Wie kann ich den Typ von onDataResponse bereitstellen? Ich habe versucht, es zu einer abstrakten Klasse mit einer implementierten Funktion zu machen, die den Typ von T zurückgibt, aber wie gebe ich den Typ von T zurück? – aviran

+0

übergibt es an seinen Konstruktor? Gibt es eine Möglichkeit, den Typ von T in Runtime zu bekommen? – aviran

+0

in der Schnittstelle können Sie z.B. Klasse getType(), so dass Sie später nur T tInstance = new Gson(). FromJson (data, responseListener.getType()); und Fabrik wird auf Zuhörer sein – Emilia