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

Java Collections API: missing a Sequence (ordered Collection) super-interface of List and Deque?

我需要在下面公开一个 API - consume(sequence) - 它要求其参数 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());
    }
}

通常会指定 consume() 接受 List;然而,一些生产者也公开了一个 Deque,以促进诸如使用 descendingIterator() 的高效反向迭代之类的事情。但是 Deque 没有扩展 List 并且为此有 (访问 LinkedList 中的索引元素的 O(n) 成本)。

所以似乎“让编译器开心”的唯一方法是将 sequence 指定为 Collection;然而,根据 Javadoc(众所周知),“有些是有序的,有些是无序的”,因此 consume() API 在语义上是松散的。

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

似乎理想的解决方案是 Java 为 ListDeque(扩展 Iterable)提供一个 Sequence 超级接口。我可以想象这没有完成的一个原因是复杂性,但我认为这个例子证明了需要。

我是不是错过了更好的策略,还是只需要等待 API 的修订?作为记录,这是 Java 17.

刚好在 OpenJDK 邮件列表中对此进行了讨论。您可以在此处找到存档:https://mail.openjdk.java.net/pipermail/core-libs-dev/2022-February/085683.html. That discussion mentions the new JEP draft: Sequenced Collections 今年推出,2022-01。

在该问题得到解决之前,恐怕您将不得不求助于记录 collections 需要订购,并相信来电者会遵守您的先决条件。