14

是否有使用原语而不是泛型类型作为键的番石榴表的替代方法?

我想使用原语来避免使用 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;
    }
}
4

1 回答 1

3

并不真地。问题是这样的实现马上就不是通用的(根据定义),需要一个一个地定义。这意味着大量的重复和潜在的许多可能的集合排列。

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

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

于 2015-07-08T13:55:19.243 回答