首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么可比和比较器在Java中是PECS通配符类型的使用者?

为什么可比和比较器在Java中是PECS通配符类型的使用者?
EN

Stack Overflow用户
提问于 2020-08-12 22:03:11
回答 3查看 331关注 0票数 4

在有效Java中,在“使用有界通配符以增加API灵活性”项目中,在谈到PECS (生产者-扩展,消费者-超级)的使用时,作者提到:

可比较性始终是使用者,所以通常应该使用Comparable<吗?超级T>优先于可比。比较器也是如此;因此,您通常应该使用Comparator<吗?超级T>优先于比较器。

我不清楚为什么比较器和比较器被认为是消费者。

在讨论PECS ( What is PECS (Producer Extends Consumer Super)? )的主题中,使用者通常将集合作为某些泛型方法的参数。

而这里的可比只是一个接口。

有谁能分享一些见解吗?谢谢!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2020-08-12 22:16:03

可以对ConsumerSupplier接口进行一个很好的类推( Supplier类似于生产者)。Consumer<T>是接收T的函数,而Supplier<T>是返回T的函数。注意,我们讨论的是方法签名和返回类型,我们对方法的语义只字未提。这是PECS的一个核心属性:它独立于语义,完全可以根据所使用方法的签名和返回类型来确定。

看看ComparableComparator,我们发现这两种方法(int compareTo(T)int compare(T, T))都可以接受,即消耗T's。

对于集合,我们必须查看如何使用集合,即如果我们使用生产者--或使用者--方法:

如果我们从集合中检索数据( ? extends T.

  • If,迭代器,.),列表为我们生成值,我们使用它来存储数据,(即我们调用add(T)addAll(Collection<T>)contains(T)、.),我们调用消费方法,因此该方法是数据的使用者E 226,我们使用? super T.

  • If存储和检索值,集合同时充当使用者和生产者,因此我们必须使用精确的T,既不使用... extends ...也不使用... extends ...
票数 5
EN

Stack Overflow用户

发布于 2020-08-12 22:13:03

“…我不清楚为什么可比较和比较器被认为是消费者。…“

每当泛型类C<T>的方法成员接受(即“消费”) T类型的参数时,该方法就是T__s的使用者。

因此,被认为是由类型变量T表示的类型的o对象的“使用者”。

票数 3
EN

Stack Overflow用户

发布于 2020-08-12 22:14:03

当我们说"Comparable是消费者“时,我们实际上指的是”接口方法是消费者“。这是对"Comparable只是一个接口“这一疑问的回答。

见其签名:https://docs.oracle.com/en/java/javase/14/docs/api/java.base/java/lang/Comparable.html#compareTo(T)

代码语言:javascript
复制
int compareTo​(T o)

它使用泛型T,不生成任何泛型对象。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63385298

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档