在集合上下文中下界的使用对我来说或多或少是清楚的(参见 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>
,因为 BigDecimal
是 Number
。这样的函数应该能够在 BigDecimal
上运行因为它需要 Number
.
您的线路Optional.of(number).map(mapper);
无法编译,因为这里 T
是 Number
,不是BigDecimal
。试图传入 Function
谁的T
是 BigDecimal
与签名不匹配--BigDecimal
不是 Number
的父类(super class)型。您试图利用? super T
这里失败了,因为您使用了不同的 T
,不是因为它失败了? super T
不知何故。这是两个不同的概念。
关于java - 为什么在函数式接口(interface)中使用下界,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48692380/