Ich versuche meine Schichten zu isolieren, wenn ich eine Anwendung erstelle, die für mehrere Jahre gewartet wird. Ich verwende Realm als Datenbank, Retrofit als Netzwerkschicht und RxJava/RxAndroid als Kommunikationsschicht in der MVP/MVVM-Architektur. In Zukunft möchte ich, dass jeder, der dieses Projekt aufgreift, in der Lage ist, einfach Realm zu tauschen oder Retrofit auszutauschen, sagen wir, wenn eine bessere Bibliothek herauskommt, die sich für zukünftige Verbesserungen eignet.Verwenden von Generics mit Realm + RxJava
Also, zu diesem Zweck versuche ich eine generische Datenbank-Schnittstelle zu bauen, und dann meine konkrete Realm-Implementierung darüber zu bauen.
Ich habe eine IDatabaseManager Schnittstelle wie folgt definiert: ‚?‘
public interface IDatabaseManager<E extends AbstractList<? extends T>, T> {
void save(T object);
Observable<E> getAsObservable(Class<?> type);
}
Die Idee ist, ich der Datenbankmanager wollen Typ E haben, die einige Liste/Sammlung einer Klasse ist wodurch ein Basisobjekt erweitert wird (für diejenigen ORMs, in denen Sie eine Basisklasse erweitern müssen).
Dann habe ich meine konkrete Umsetzung, die Reich nutzt:
public class RealmManager implements IDatabaseManager<RealmResults<? extends RealmObject>, RealmObject> {
@Override
void save(RealmObject object) {
//implementation works
}
@Override
Observable<RealmResults<? extends RealmObject>> getAsObservable(Class<?> type) {
Realm realm = realm.getDefaultInstance();
return realm.where(type).findAllAsync().asObservable();
}
}
aber ich erhalte eine Fehlermeldung auf "Typ", dass:
where (java.lang.Class<E>) in Realm cannot be applied
to (java.lang.Class<capture<?>>)
reason: inference variable E has incompatible bounds:
equality constraints: capture of ?
upper bounds: Realm Model
Realm-Abfragen durchführt, indem in Einnahme eine Klasse der Objektsammlung, die Sie abfragen, wobei das Objekt RealmObject (abstrakt) erweitern oder RealmModel (Schnittstelle) implementieren muss, aber sie sollen austauschbar sein.
Irgendwelche Hilfe hier? Ich glaube, ich bin nur eine Syntax hier vermasselt und ich kann einfach nicht herausfinden, wie ich das Problem beheben kann =/