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> { .. }
假设我有这个 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> { .. }