为什么可选的ispresent类方法采用consumer< ?super t>作为参数,而不是使用者< t>?

jslywgbw  于 2021-08-20  发布在  Java
关注(0)|答案(1)|浏览(510)

我正在阅读有关通配符的文章,我有点困惑。我真的不明白为什么ifpresent方法需要通配符 ? super T . public void ifPresent(Consumer<? super T> consumer) 为什么不工作?
我读过关于PEC的书,很清楚它是如何用于类方法的,例如,但是为什么它在接口中,我很乐意提供帮助。

z9smfwbn

z9smfwbn1#

最可能的原因是允许 Consumer 它的类型比 T (这是一种与 T )能够用于 consumer 论点
下面是一个例子:

Optional<String> opt = Optional.of("abc");
Optional<Integer> intOptional = Optional.of(2);

Consumer<Object> printConsumer = System.out::println;
opt.ifPresent(printConsumer);
intOptional.ifPresent(printConsumer);
``` `printConsumer` 只是一个打印对象的函数。所以这两种方法都适用 `String` 及 `Integer` 类型。
如果 `ifPresent` 只用 `Consumer<T>` ,则无法编写上述代码,因为无法使用 `Consumer<Object>` 哪里 `Consumer<String>` 或 `Consumer<Integer>` 是必需的。但是在消费者示例已经存在并且与多个用户示例兼容的情况下 `T` 类型, `Consumer<? super T>` 使重用使用者示例成为可能。

相关问题