我正在努力從我最近的學校專案中找到并理解以下代碼中的錯誤。我認為在您的幫助下,我可以從這個錯誤中學到很多東西!
我有這個“主”類,我在其中存盤了不同 DAO 的地圖,如下所示:
class Main {
private static Map<Class<?>, Repository<?, ?>> daos = new HashMap<>();
...
public void init() {
daos.put(Account.class, new AccountDAO());
List<Account> accounts = new ArrayList<Account>();
... using Faker to create new instances of the class Account ...
daos.get(Account.class).saveAll(accounts);
}
}
最后一行產生關于強制轉換和泛型型別的錯誤訊息:
型別 Repository<capture#5-of ?,capture#6-of ?> 中的方法 saveAll(Iterable<S extends capture#of ?>) 不適用于引數 (Iterable)
為了通過編碼學習,我制作了我的自定義存盤庫類,如下所示:
public interface Repository<T, K> {
final static EntityManager ENTITY_MANAGER = EntityManagerHelper.getEntityManager();
public default <S extends T> void save(S entity) {
try {
EntityManagerHelper.beginTransaction();
ENTITY_MANAGER.persist(entity);
EntityManagerHelper.commit();
} catch (Exception exception) {
System.err.println(exception.getMessage());
EntityManagerHelper.rollback();
}
}
public default <S extends T> void saveAll(Iterable<S> objects) {
for (S object : objects) {
this.save(object);
}
}
}
例如,我有一個實作上述代碼的類:
public class AccountDAO implements fr.istic.taa.jpa.repository.Repository<Account, String> {
...
}
uj5u.com熱心網友回復:
public default <S extends T> void saveAll(Iterable<S> objects) {
意味著泛型型別S應該具有 type的型別T或子型別T。實際上,在您的示例中,這意味著您期望通用型別 Account 的 Iterable。
但是,當您嘗試從 Dao 映射中獲取存盤庫類時,它的型別在編譯時是未知的,因為它被宣告為:Repository<?, ?>
因此,您必須在代碼中指定它,例如:
Repository<Account, String> repository = (Repository<Account, String>) daos.get(Account.class);
repository.saveAll(accounts);
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/510436.html
上一篇:phplaravel->狀態檢查按鈕的值不會進入資料庫(始終保持0)
下一篇:有沒有辦法在飛鏢中拋出泛型
