Java 中的通用存储库

Generic repository in Java

假设我有这个 class:

public class PhotoRepository  {
    private PhotoDao db;

    PhotoRepository(PhotoDao dao) {
        db = dao;
    }

    public void save(List<Photo> photos) { db.insertOrReplaceInTx(photos); }
    public List<Photo> all()  { return db.loadAll(); }
    public Photo get(Long id) { return db.load(id);  }
}

因为我有更多种类的实体,而不仅仅是照片,我想要一个通用的存储库,我可以在其中传递任何类型的 Dao。

我试过使用Class<? extends AbstractDao<?, ?>>作为构造函数的参数,但是编译器说无法解析de dao方法。沿着这些线的东西:

public class Repository<T>  {
    private Class<? extends AbstractDao<T, ?>> db;

    Repository(Class<? extends AbstractDao<T, ?>> dao) {
        db = dao;
    }

    public void save(List<T> items) { db.insertOrReplaceInTx(items); }
    public List<T> all()  { return db.loadAll(); }
    public T get(Long id) { return db.load(id);  }
}

我试过使用类型参数和不使用类型参数,以及其他几种排列方式,但都没有成功。 在 Java 中有没有办法做到这一点?

谢谢。

你必须为 Repository class 引入第二个类型参数,它将代表 dao,因为 Class<? extends AbstractDao<T, ?>> 是不正确的。

我们称此第二类参数为D。它必须始终是 AbstractDao 的子 class,由您要操作的对象类型参数化(即类型 T

public class Repository<T, D extends AbstractDao<T>>  {
    private D db;

    Repository(D dao) {
        db = dao;
    }

    public void save(List<T> items) { db.insertOrReplaceInTx(items); }
    public List<T> all()  { return db.loadAll(); }
    public T get(Long id) { return db.load(id);  }
}

然后,您将能够实例化 Repository

Repository<Photo, PhotoDao> repo = new Repository<>(new PhotoDao());

请注意,我假设 PhotoDao 定义为:

class PhotoDao extends AbstractDao<Photo> { .. }