为什么OptionalisPresent类方法采用Consumer<?superT>作为参数,而不是Consumer<T>?

我正在阅读通配符,但我有点困惑。我真的不明白为什么 ifPresent 方法需要? super T.
public void ifPresent(Consumer<? super T> consumer)
为什么不只是 T 工作?

我已经阅读了有关 PECS 的内容,并且很清楚它是如何用于类方法的,例如,但是为什么它会出现在界面中,我很乐意提供帮助。

回答

最可能的原因是允许Consumers 的类型更广泛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只是一个打印对象的函数。所以它适用于StringInteger类型。

如果ifPresent只使用了Consumer<T>,就不能像上面那样编写代码,因为不能Consumer<Object>在需要的地方Consumer<String>Consumer<Integer>需要的地方使用。但是在消费者实例已经存在并且与多种T类型兼容的情况下,Consumer<? super T>可以重用消费者实例。


以上是为什么OptionalisPresent类方法采用Consumer&lt;?superT&gt;作为参数,而不是Consumer&lt;T&gt;?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>