java - 为什么在函数式接口(interface)中使用下界

标签 java generics java-8 option-type bounded-wildcard

在集合上下文中下界的使用对我来说或多或少是清楚的(参见 PECS question )。 Java 中的函数式接口(interface)则不然。例如。为什么Optional.map方法具有较低类型界限的签名:

<U> Optional<U> map(Function<? super T, ? extends U> mapper);

这里使用 super 有什么好处?为什么下面的代码无法编译?

public static void main(String[] args) {
    Function<? super BigDecimal, ? extends Number> mapper = dec -> dec
        .divide(BigDecimal.TEN)
        .doubleValue();
    BigDecimal bigD = BigDecimal.ONE;
    //works
    Optional.of(bigD).map(mapper);

    Number number = BigDecimal.ONE;
    // the following does not compile,
    // despite Number is super type of BigDecimal
    Optional.of(number).map(mapper);
}

最佳答案

mapper中下限的目的参数map就是扩大可接受的范围Function s,不仅包括那些 Function 恰好 T ,还有 T 的那些类型可能是一个子类。例如。这样的Optional<BigDecimal>可能接受的不仅仅是Function<BigDecimal, Number> ,但是 Function<Number, Number> ,因为 BigDecimalNumber 。这样的函数应该能够在 BigDecimal 上运行因为它需要 Number .

您的线路Optional.of(number).map(mapper);无法编译,因为这里 TNumber ,不是BigDecimal 。试图传入 Function谁的TBigDecimal与签名不匹配--BigDecimal不是 Number 的父类(super class)型。您试图利用? super T这里失败了,因为您使用了不同的 T ,不是因为它失败了? super T不知何故。这是两个不同的概念。

关于java - 为什么在函数式接口(interface)中使用下界,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48692380/

相关文章:

java - 使用 JButton、JSpinner 等在 JPanel 上绘图

java - 在 eclipse 中构建项目,但不是从终端/jenkins - 使用 Ant

java - 在 CSS 中设置 JavaFX Anchor Pane 的 anchor

Java 扩展 Map.entry() 而不使用泛型

c# - 如何在泛型方法中使用泛型类型

Java 8 语法迭代并调用基于所有元素的否定谓词的方法?

java - 使用 Spring Boot 将 Oracle 数据传输到 SQL Server

java - 对本例中 ConcurrentHashMap 和 HashMap 行为的区别感到困惑

java - 如何使用java从json中检索元素值?

java - java中字符串可以包含<0x00>以及指定的值吗