假设我有这门课:
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); }
}
我试过使用type参数,但没有使用它,还有其他一些排列,没有运气。
有没有办法在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> { .. }