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 为 List
和 Deque
(扩展 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 需要订购,并相信来电者会遵守您的先决条件。
我需要在下面公开一个 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 为 List
和 Deque
(扩展 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 需要订购,并相信来电者会遵守您的先决条件。