我需要公开一个API-consume(sequence)(见下文),该API要求其argument 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,并且有likely good reasons(在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.讨论中提到了今年推出的新JEP draft: Sequenced Collections,即2022-01年.

在这件事解决之前,恐怕你必须记录下需要订购的藏品,并相信来电者会遵守你的先决条件.

Java相关问答推荐

如何转换Tue Feb 27 2024 16:35:30 GMT +0800 String至ZonedDateTime类型""

Jooq外键关系

如何在返回bigint []值的子查询中使用any?

有没有一种方法使保持活动设置专用于java.net.http.HttpClient的一个实例

不推荐使用的Environment.getExternalStorageDirectory().getAbsolutePath()返回的值不同于新的getExternalFilesDir(空)?

如何在Java记录中设置BigDecimal类型属性的精度?

Javadoc在方法摘要中省略方法

对字符串长度进行排序,但颠倒了顺序(最长字符串在前)

如何集成语义发布和BitBucket(Java项目)

如何在JavaFX循环中完美地制作一个AudioClip/MediaPlayer?

使用正则表达式从字符串中提取多个值

try 使用类来包含JSON响应

使用for循环时出现堆栈溢出错误,但如果使用if块执行相同的操作,则不会产生错误

根据应用程序 Select 的语言检索数据

如何利用OpenTelemeter将初始值(零)输出到普罗米修斯

如果c不为null,Arrays.sort(T[]a,Comparator<;?super T>;c)是否会引发ClassCastException?

多线程、并发和睡眠未按预期工作

带有提取器的JavaFXObservableList会根据侦听器的存在而改变行为

窗口启动后不久,从java.awt.Graphics disapear创建的矩形

Android 仅在应用程序关闭之前授予对文件夹的访问权限