あなたはDaoFactory
を宣言することができます:
public interface DaoFactory<D extends Dao<? extends MyObject>> {
<T extends MyObject> D getDao(Class<T> type);
}
その後、JsonDaoFactory
を実装することができ、次のように:
public class JsonDaoFactory implements DaoFactory<JsonDao<? extends MyObject>> {
private final Map<Class<? extends MyObject>, JsonDao<? extends MyObject>> daos =
new HashMap<>();
public JsonDaoFactory() {
daos.put(Contact.class, new JsonContactDao());
daos.put(Customer.class, new JsonCustomerDao());
}
@Override
@SuppressWarnings("unchecked")
public <T extends MyObject> JsonDao<T> getDao(Class<T> type) {
return (JsonDao<T>) daos.get(type);
}
}
私はMyObject
試合のすべての子孫を作るためにMap
を使用しました対応するJsonDao
(ここではContact
とCustomer
を使用しました)とJsonContactDao
およびJsonCustomerDao
)。私は明示的にコンストラクタ内のマップを塗っているので、チェックされていないキャスト警告を抑制したので、私はClassCastException
がないと確信しています。
は完全を期すため、ここではSqliteDaoFactory
のためのコードです:両方の工場のための
public class SqliteDaoFactory implements DaoFactory<SqliteDao<? extends MyObject>> {
private final Map<Class<? extends MyObject>, SqliteDao<? extends MyObject>> daos =
new HashMap<>();
public SqliteDaoFactory() {
daos.put(Contact.class, new SqliteContactDao());
daos.put(Customer.class, new SqliteCustomerDao());
}
@Override
@SuppressWarnings("unchecked")
public <T extends MyObject> SqliteDao<T> getDao(Class<T> type) {
return (SqliteDao<T>) daos.get(type);
}
}
コードがほとんど重複しているが、私はこれを解決する方法を見つけることができませんでした。ここで
は、これらの工場を使用する方法は次のとおりです。
JsonDaoFactory jsonDaoFactory = new JsonDaoFactory();
JsonDao<Contact> contactJsonDao = jsonDaoFactory.getDao(Contact.class);
JsonDao<Customer> customerJsonDao = jsonDaoFactory.getDao(Customer.class);
SqliteDaoFactory sqliteDaoFactory = new SqliteDaoFactory();
SqliteDao<Contact> contactSqliteDao = sqliteDaoFactory.getDao(Contact.class);
SqliteDao<Customer> customerSqliteDao = sqliteDaoFactory.getDao(Customer.class);
これは本当に型消去の問題ではありません。 Javaには、 'T 'のような構文構造のための機能がありません。 – Radiodef
'interface DaoFactory >'? –
@Jorn Vernee MyObjectを拡張する複数のクラスに対して、Daosをインスタンス化する必要があるため、できません。 –