【问题标题】:Why lower bound is used in functional interfaces [duplicate]为什么在功能接口中使用下限[重复]
【发布时间】:2018-02-08 18:25:48
【问题描述】:

我对集合上下文中下限的使用或多或少很清楚(请参阅PECS question)。 Java 中的函数式接口并非如此。例如。为什么 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);
}

【问题讨论】:

    标签: java generics java-8 optional bounded-wildcard


    【解决方案1】:

    将mapper 参数中的下限设置为map 的目的是扩大可接受的Functions 的范围,不仅包括那些具有确切的Functions T,还有那些 T 可能是子类的类型。例如。这样的Optional&lt;BigDecimal&gt; 不仅可以接受Function&lt;BigDecimal, Number&gt;,还可以接受Function&lt;Number, Number&gt;,因为BigDecimal 是Number。这样的函数应该能够在BigDecimal 上运行,因为它需要Number。

    您的行 Optional.of(number).map(mapper); 无法编译,因为这里的 T 是 Number,而不是 BigDecimal。尝试传入 T 为 BigDecimal 的 Function 与签名不匹配 -- BigDecimal 不是 Number 的超类型。您在这里利用? super T 的尝试失败了,因为您使用了不同的T,而不是因为它以某种方式失败了? super T。这是两个不同的概念。

    【讨论】:

    • 谢谢!我想我现在明白了。我的本地映射器变量声明使用了super关键字,这显然不是必需的,而是IDE生成的
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-21
    • 2020-09-15
    • 1970-01-01
    • 1970-01-01
    • 2012-05-23
    相关资源
    最近更新 更多