假设我有这门课:

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> { .. }

09-12 16:43