gpt4 book ai didi

java - Java 中的通用存储库

转载 作者:太空狗 更新时间:2023-10-29 16:36:03 28 4
gpt4 key购买 nike

假设我有这个类(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 引入第二个类型参数类,它将代表 dao,因为 Class<? extends AbstractDao<T, ?>>不正确。

我们称这第二种类型参数为D .它总是必须是 AbstractDao 的子类,由您要操作的对象类型参数化(即类型 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> { .. }

关于java - Java 中的通用存储库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28691411/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com