我正在尝试使用Generics来保持良好的抽象。
在几个班级之间移动“未经检查的演员”之后,我不得不选择哪个“未经检查的演员”是较小的邪恶,这就是我得到的:
public class DaoFactory {
private static DaoFactory instance;
private HashMap<String, Dao<?, BigDecimal>> registeredClasses = new HashMap<String, Dao<?, BigDecimal>>();
private DaoFactory() {
}
public static synchronized DaoFactory getInstance() {
if (instance == null)
instance = new DaoFactory();
return instance;
}
public <T> void registerDao(String daoId, Dao<T, BigDecimal> d) {
registeredClasses.put(daoId, d);
}
@SuppressWarnings("unchecked")
public <T> Dao<T, BigDecimal> createDao(String daoId) {
return (Dao<T, BigDecimal>) (registeredClasses.get(daoId)).createDao();
}
}
正如你所看到的,我添加了一个@SuppressWarnings("unchecked")
,我收到了“未经检查的演员”警告。
问题在于:registeredClasses
不能为HashMap<String, Dao<T, BigDecimal>>
,因为我需要将类型参数T
添加到DaoFactory
class(它将是class DaoFactory<T>
)。如果我添加该参数,那么instance = new DaoFactory();
也需要<T>
。但它在一个静态的mathod中(DaoFactory
是一个单例),所以我不能使用T
。所以我使用HashMap<String, Dao<?, BigDecimal>> registeredClasses
代替HashMap<String, Dao<T, BigDecimal>> registeredClasses
。
所以我在这个工厂类里面都有“<T>
- 世界”和“<?>
- 世界”。所以我必须从Dao<?, BigDecimal>
投射到Dao<T, BigDecimal>
并使用@SuppressWarnings("unchecked")
。你认为这是可以接受的吗?
答案 0 :(得分:0)
我不确定这是可行的程度,因为你需要一个Class对象来强制转换;因为类型擦除将T变成对象。
public void registerDao(String daoId, Dao<Object, BigDecimal> d) {
registeredClasses.put(daoId, d);
}
public <T> Dao<T, BigDecimal> createDao(Class<Dao<T, BigDecimal>> klazz,
String daoId) {
return klazz.cast(registeredClasses.get(daoId).createDao());
}
此处Dao
包裹起来没有帮助,最好使用Class<T>
。