我正在查看Java8的功能接口 Consumer 。我可以看到默认方法然后。我知道该方法用于将消费者的链接在一起。下面是andThen方法的代码:
default Consumer<T> andThen(Consumer<? super T> after) {
Objects.requireNonNull(after);
return (T t) -> { accept(t); after.accept(t); };
}
问题:为什么在 andThen 方法的Consumer参数中仅允许元素的类型和SuperType(?super T)。我想在这里了解用法的目的。
我将帮助我增进对泛型的理解。
答案 0 :(得分:2)
假设您有一个Consumer<Dog>
和一个Consumer<Animal>
。当然,您可以将Dog
传递到这两个accept
方法中,因为Dog
是Animal
。
但是,在Java中,Consumer<Dog>
和Consumer<Animal>
之间没有继承关系,原因是已在此站点上的其他问题上进行了讨论。因此,要允许我们链接将接受Consumer
的任何其他Dog
,我们需要将其声明为Consumer<? super Dog>
。