是否有替代Guava Tables使用基元而不是泛型类型作为键?
我想使用原语来避免因使用Java Numbers和Java Maps创建的其他入口对象而导致的自动装箱。
我使用Trove TLongObjectMap推出了我自己的基本LongLongObjectTable,但如果有可用标准库,则更愿意使用。
private static class LongLongObjectTable<T> {
private final TLongObjectMap<TLongObjectMap<T>> backingMap = new TLongObjectHashMap<>();
T get(final long rowKey, final long columnKey) {
final TLongObjectMap<T> map = this.backingMap.get(rowKey);
if (map == null) {
return null;
}
return map.get(columnKey);
}
void put(final long rowKey, final long columnKey, final T value) {
TLongObjectMap<T> map = this.backingMap.get(rowKey);
if (map == null) {
map = new TLongObjectHashMap<>();
this.backingMap.put(rowKey, map);
}
map.put(columnKey, value);
}
Collection<T> values() {
final List<T> values = new ArrayList<T>();
for (final TLongObjectMap<T> map : this.backingMap.valueCollection()) {
values.addAll(map.valueCollection());
}
return values;
}
}
答案 0 :(得分:2)
不是真的。问题是这样的实现很快就不是通用的(根据定义),需要逐个定义。这意味着重要的重复,并可能有很多可能的收集排列。
也就是说,其他语言通过使编译器为类型为T的集合的实例生成代码而不是使用type erasure来实现这一点,但这不是java的方向。
对于绝大多数情况,您可以在现有集合上使用自动盒装变体(如Long或Integer),因为开销相对较低。此外,标准库的设计者可能更喜欢保持纤细,而不是使用其他自定义变体污染它。