【发布时间】:2011-06-30 22:07:05
【问题描述】:
我正在尝试实现一个类型安全的异构容器来存储异构对象的列表。
我见过几个类型安全的异构容器模式 (link) 的例子,但它们都存储一个类型的单个对象。
我尝试如下实现:
public class EntityOrganizer {
private Map<Class<?>, List<Object>> entityMap = new HashMap<Class<?>, List<Object>>();
public <T> List<T> getEntities(Class<T> clazz) {
return entityMap.containsKey(clazz) ? entityMap.get(clazz) : Collections.EMPTY_LIST;
}
private <T> void addEntity(Class<T> clazz, T entity) {
List<T> entityList = (List<T>) entityMap.get(clazz);
if(entityList == null) {
entityList = new ArrayList<T>();
entityMap.put(clazz, (List<Object>) entityList);
}
entityList.add(entity);
}
}
但问题是这段代码充满了未经检查的强制转换。有人可以提供更好的实现方式吗?
非常感谢
【问题讨论】:
-
将
entityMap设为Map<Class<?>, List<?>>会更正确,因为这些值不是List<Object>,而是List<various things> -
这不是您问题的解决方案,但请考虑使用 Guava Multimap 而不是 Map
。 -
我建议在 this answer 中使用
ClassToInstanceMultimapAPI,遵循 Guava 的Multimap和ClassToInstanceMap类型。
标签: java design-patterns generics