在Java8 Consumer中使用“?super T”的目的,然后

时间:2019-01-13 16:01:06

标签: java java-8

我正在查看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)。我想在这里了解用法的目的。

我将帮助我增进对泛型的理解。

1 个答案:

答案 0 :(得分:2)

假设您有一个Consumer<Dog>和一个Consumer<Animal>。当然,您可以将Dog传递到这两个accept方法中,因为DogAnimal

但是,在Java中,Consumer<Dog>Consumer<Animal>之间没有继承关系,原因是已在此站点上的其他问题上进行了讨论。因此,要允许我们链接将接受Consumer的任何其他Dog,我们需要将其声明为Consumer<? super Dog>