Effective Java 中的第 29 项提出了一种实现“类型安全”异构集合的方法,基本上可以归结为如下内容:
public Class HeterogeneousContainer {
private Map<Class<?>, Object> container = new HashMap<>();
public <T> put(Class<T> type, T instance) {
container.put(type, instance);
}
public <T> T get(Class<T> type) {
//essentially just
// return (T) container.get(type);
return type.cast(container.get(type));
}
}
然后(由生产者)像这样使用哪个(我想):
List<HeterogeneousContainer> resultSet = new ArrayList<>();
...
resultSet.add(new HeterogeneousContainer());
...
resultSet.get(rowIndex).add(Column1.class, column1Value);
resultSet.get(rowIndex).add(Column2.class, column2Value);
...
像这样(由消费者):
for(HeterogeneousContainer row:resultSet) {
Column1 column1Value = row.get(Column1.class);
Column2 column2Value = row.get(Column2.class);
...
//do something with the columnValues
}
我现在的问题是为什么这被认为是类型安全的?这比仅将列名放入地图或仅使用常规List
/List<Object>
并按索引查找列有什么好处?
这是否以任何方式有效/实际改进了 JDBC ResultsSets 的 .getString/.getInt/.getXXXX 方法?