Java Collections API:缺少 List 和 Deque 的 Sequence(有序集合)超级接口?

sxc*_*731 5 java collections

我需要公开一个 API(consume(sequence)如下),该 API 要求其参数sequence集合按照以下摘录进行排序:

interface Consumer<T> {
    /**
     * @param sequence: an *ordered* collection of Ts to be processed in order
     */
    public void consume(Collection<T> sequence);
}

interface Producer<T> {
    Collection<T> getSequence();
}

class Producer1<T> implements Producer<T> {
    public List<T> getSequence() {
        return new ArrayList<>();
    }
}
class Producer2<T> implements Producer<T> {
    public Deque<T> getSequence() {
        return new LinkedList<>();
    }
}

class Test {
    void testMethod(Consumer<Long> consumer) {
        consumer.consume(new Producer1<Long>().getSequence());
        consumer.consume(new Producer2<Long>().getSequence());
    }
}
Run Code Online (Sandbox Code Playgroud)

通常,人们会指定consume()接受List; 然而,一些生产者也公开 a Deque,以便于使用 进行高效反向迭代之类的事情descendingIterator()。但是Deque不会扩展List,并且可能有充分的理由(访问 a 中的索引元素的 O(n) 成本LinkedList)。

因此,“让编译器满意”的唯一方法似乎是指定sequenceCollection; 然而,根据Javadoc(众所周知),“有些是有序的,有些是无序的”,因此 APIconsume()在语义上松散了。

另一种解决方法是Producer2公开 aLinkedList而不是 a Deque(并恢复consume()为接受 a List),但我们知道公开实现而不是接口并不理想。

看来理想的解决方案是 Java为and提供一个Sequence超级接口(扩展)。我可以想象没有这样做的一个原因是复杂性,但我认为这个例子证明了这种需要。ListDequeIterable

我是否缺少更好的策略,或者我只需要等待 API 的修订?根据记录,这是 Java 17。

Rob*_*oor 8

OpenJDK 邮件列表中恰好有关于此的讨论。您可以在这里找到存档:https://mail.openjdk.java.net/pipermail/core-libs-dev/2022-February/085683.html。该讨论提到了新的JEP 草案:今年(2022 年 1 月)推出的序列集合。

在这个问题得到解决之前,恐怕您将不得不求助于记录需要订购的集合,并相信呼叫者会遵守您的先决条件。