将Generics与Realm + RxJava一起使用

时间:2016-08-28 20:50:15

标签: java android generics inheritance realm

在构建将要维护多年的应用程序时,我试图隔离我的图层。我使用Realm作为数据库,将Retrofit作为网络层,使用RxJava / RxAndroid作为MVP / MVVM架构中的通信层。在未来,我希望任何参与这个项目的人能够简单地换掉Realm或换掉Retrofit,比如说有更好的库可以用来进行未来的改进。

因此,为此,我尝试构建通用数据库接口,然后在其上构建我的具体Realm实现。

我有一个IDatabaseManager接口,定义如下:

public interface IDatabaseManager<E extends AbstractList<? extends T>, T> {
    void save(T object);
    Observable<E> getAsObservable(Class<?> type);
}

我的想法是,我希望数据库管理器具有类型E,它是某些类的列表/集合&#39;?&#39;它扩展了一些基础对象(对于那些需要你扩展一些基类的ORM)。

然后,我有我的具体实现,它利用了领域:

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();
  }
}

然而,我在&#34;输入错误&#34;的是:

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通过接受您要查询的对象集合的类来执行查询,该对象必须扩展RealmObject(抽象),或实现RealmModel(接口),但它们应该是可互换的。

这里有什么帮助吗?我想我只是弄乱了一些语法,我只是无法弄清楚如何解决它= /

1 个答案:

答案 0 :(得分:0)

您的初步问题由

回答
  @Override
  <T extends RealmModel> Observable<RealmResults<T> getAsObservable(Class<T> type) {
    Realm realm = realm.getDefaultInstance();
    return realm.where(type).findAllAsync().asObservable();
  }

但实际上,如果您希望能够简单地换掉Realm&#34;,那么您将不得不放弃零拷贝评估和实时自动更新,转而支持复制领域对象。

return Observable.defer(() -> {
    try(Realm realm = Realm.getDefaultInstance()) {
        return Observable.just(realm.copyFromRealm(realm.where(type).findAll()));
    }
}).subscribeOn(Schedulers.io());

(虽然如果你问我这个目的就失败了 - 毕竟,Realm的设计是为了让你不需要把所有东西都复制到记忆中)