为什么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只是一个打印对象的函数。所以它适用于String和Integer类型。
如果ifPresent只使用了Consumer<T>,就不能像上面那样编写代码,因为不能Consumer<Object>在需要的地方Consumer<String>或Consumer<Integer>需要的地方使用。但是在消费者实例已经存在并且与多种T类型兼容的情况下,Consumer<? super T>可以重用消费者实例。
THE END
二维码