番石榴表的原始替代品

问题描述 投票:14回答:1

是否有替代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;
    }
}
java guava trove4j
1个回答
2
投票

并不是的。问题是这样的实现很快就不是通用的(根据定义),需要逐个定义。这意味着重复重复并且可能存在许多可能的收集排列。

也就是说,其他语言通过使编译器为类型为T的集合的实例生成代码而不是使用type erasure来实现这一点,但这不是java的方向。

事实上,您可以在现有集合上使用自动盒装变体(如Long或Integer),这对于绝大多数情况来说已经足够了,因为开销相对较低。此外,标准库的设计者可能更喜欢保持纤薄,而不是使用其他自定义变体污染它。

© www.soinside.com 2019 - 2024. All rights reserved.