我正在阅读有关通配符的文章,我有点困惑。我真的不明白为什么ifpresent方法需要通配符 ? super T . public void ifPresent(Consumer<? super T> consumer) 为什么不工作?我读过关于PEC的书,很清楚它是如何用于类方法的,例如,但是为什么它在接口中,我很乐意提供帮助。
? super T
public void ifPresent(Consumer<? super T> consumer)
z9smfwbn1#
最可能的原因是允许 Consumer 它的类型比 T (这是一种与 T )能够用于 consumer 论点下面是一个例子:
Consumer
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>` 使重用使用者示例成为可能。
1条答案
按热度按时间z9smfwbn1#
最可能的原因是允许
Consumer
它的类型比T
(这是一种与T
)能够用于consumer
论点下面是一个例子: