gpt4 book ai didi

Java Function and then 签名解释

转载 作者:行者123 更新时间:2023-12-02 01:09:08 25 4
gpt4 key购买 nike

signature然后是:(Function<? super R,? extends V> after)

我不明白为什么函数的输入是:? super R

根据我的理解,当我们编写一个值时,会使用 super 。但是传递给 andThen 的函数将读取第一个函数的值。

例如:

Function<Integer, Integer> f1 = x -> x * 2;
Function<Integer, Integer> f2 = x -> x * 3;
Integer myApplyThen = (input) -> {
Integer y1 = f1.apply(input);
Integer y2 = f2.apply(y1);
return y2;
}

正如我们在这个逻辑中看到的,不需要向传递给 Function 的泛型参数写入任何值。两者f1.applyf2.apply只是转换他们的输入,即读取和返回。所以根据我的说法,andThen 的类型定义应该是: Function<? extends R,? extends V> after

但既然事实并非如此,我错过了什么?

最佳答案

当您使用 Integer 时,原因并不明显,它是最终类,因此不能有子类。

考虑一下:

Function<Number, Number> f1 = x -> x.doubleValue() * 2;
Function<Double, Double> f2 = x -> x.doubleValue() * 3;

Number myApplyThen = (input) -> {
Number y1 = f1.apply(input);
Double y2 = f2.apply(y1); // ERROR: f2 requires a Double!
};

给 andThen 的函数需要能够处理结果类型 R。如果它接受父类(super class)型,那么我们知道它可以将 R 作为输入处理;例如,Function<Object, String>将接受任何值作为输入。

但是如果给 andThen 的函数只接受 R 的子集,这就是 ? extends R (潜在) 表示,那么假设您可以将任何 R 实例传递给它是不安全的。

我们可以在上面的示例中看到这一点:f2 期望 Number 的特定子类型作为输入,并且由于编译器只知道 f1 能够返回 Number 对象,该对象可能是 Double 或 Integer 或 BigDecimal 或 AtomicLong,将该结果作为输入传递给 f2 是不安全的。

关于Java Function and then 签名解释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59621339/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com