2017-06-11 4 views
0

Ausführen des folgenden Code:Generisches Interface Fehler

public static void get(FirebaseObject o, final Class<? extends FirebaseObject> cls, final 
    Callback<? extends FirebaseObject> callback) { 
    FirebaseDatabase.getInstance().getReference().child(o.getPath()) 
     .addListenerForSingleValueEvent(new ValueEventListener() { 
      @Override 
      public void onDataChange(DataSnapshot dataSnapshot) { 
      FirebaseObject o = dataSnapshot.getValue(cls); 
      o.setKey(dataSnapshot.getKey()); 
      cls.cast(o); 
      callback.onSuccess(cls.cast(o)); 
      } 

      @Override 
      public void onCancelled(DatabaseError databaseError) { 
      callback.onError(databaseError); 
      } 
     }); 
    } 

    public interface Callback<F extends FirebaseObject> { 
    void onSuccess(F firebaseObject); 
    void onError(DatabaseError error); 
    } 

Ich erhalte eine Fehlermeldung bei callback.onSuccess(cls.cast(o));:

`onSuccess <capture ? extends FirebaseObject> in Callback cannot be applied to <capture ? extends FirebaseObject>` 

Grundsätzlich Ich versuche, die Class<? extends FirebaseObject> cls zu übergeben, die in onSuccess() gegeben wurde, nach der Einstellung Schlüssel.

Gibt es eine Umgehung dieser Fehler? Oder eine alternative Implementierung, um das Ziel zu erreichen?

+0

vielleicht sollten Sie die Methode Parameter generify anstelle Platzhalter verwenden, das heißt 'static void get (T o, letzte Klasse cls, letzte Rückruf Rückruf)' – Moira

+0

Wenn Sie sagen, "running" , Ich nehme an, du meinst "kompilieren"? –

+1

Aber bitte konstruiere einen [minimalen Testfall] (http://stackoverflow.com/help/mcve), weil es momentan schwierig ist, das Holz für die Bäume zu sehen. –

Antwort

3
final Class<? extends FirebaseObject> cls, 
final Callback<? extends FirebaseObject> callback 

Wenn Sie diese beiden Parameter mit separaten ? extends Einschränkungen haben, ist es möglich, dass sie auf zwei verschiedene Unterklassen zu beziehen. Wenn Sie zwei Unterklassen class A extends FirebaseObject und class B extends FirebaseObject haben, könnten die Parameter

final Class<A> cls, final Class<B> callback 

sein, wenn das der Fall wäre dann callback.onSuccess(cls.cast(o)) würde nicht funktionieren, weil cls.cast(o) zurückkehren würde ein A Objekt und onSuccess würde eine B wollen.

Wenn Sie beabsichtigen, dass sich diese auf dieselbe Klasse beziehen, müssen Sie dies explizit machen, indem Sie ihr einen Namen zuweisen.

public static <T extends FirebaseObject> void get(
    FirebaseObject o, final Class<T> cls, final Callback<T> callback) 
+0

Diese Erklärung macht so viel Sinn, ich konnte nicht herausfinden, was der Fehler mir sagen wollte, da es gerade gesagt hat "x kann nicht auf x angewendet werden". – xsorifc28

2

Ihre callback Parameter könnten mit den unvereinbar o Sie übergeben in. Zum Beispiel, wenn callback ein Callback<FirebaseObjectA> ist noch o ist ein FirebaseObjectB, dann wird es auf der Laufzeit der Luft sprengen.

sollten Sie erwägen, einen Typ-Parameter auf Ihre Methode hinzufügen, etwa so:

public static <T extends FirebaseObject> void get(T o, final Class<T> cls, final Callback<T> callback) {