为什么 return 类型不是我在此处编码的内容?

Why isn't the return type what I have coded here?

我想做的是这样的:

Function<Function<Bill, Optional<?>>,Function<Bill, Optional<String>>> has =
            fn -> b -> fn.apply(b).isPresent()
                    ? emptyStrOpt.get()
                    : Optional.of("Missing");

一个Bill可能有一个Claim。我想这样做: has.apply(toClaim)

    static final Function<Bill,Optional<Claim>> toClaim = b -> Optional.ofNullable(b.getClaim());

编译器不喜欢这样:

Required type: Function <Bill,Optional<?>>

Provider: Function <Bill,Optional<Claim>>

我想解决这个问题,我会写这样的东西来转换我传递给对象的函数:

    static <R> Function<Bill,Optional<Object>> generifyOutput(Function<Bill,Optional<R>> toX){
        return b -> toX.apply(b).map(x -> Optional.of((Object) x));
    }

static final Function<Function<Bill,Optional<Object>>,
            Function<String,
                    Function<Bill,Function<Bill,Optional<String>>>>> isPresent =
                        toX -> missingMsg -> b ->
                                toX.apply(b).isPresent()
                                        ? (Bill x) -> emptyStrOpt.get()
                                        : (Bill x) -> Optional.of(missingMsg);

然后调用isPresent.apply(generifyOutput(toClaim)).apply("No claim")

但是编译器吓坏了,说我提供的是 Function<Bill, ? extends Object> 而不是 Function<Bill,Optional<String>>

这里还有什么我可以做的吗?我可以

那样暴力破解它
Function<Bill,Optional<String>> hasClaim =
            b -> toClaim.apply(b).isPresent()
                ? emptyStrOpt.get()
                : Optional.of("No claim");

不过,这似乎有点笨手笨脚,对 Bill

的每个可为 null 的成员重复相同的逻辑

改成 ? extends Optional<?>Optional<Claim> 与之兼容。

泛型类型是 不变的 ,意思是,只有完全匹配的东西,sub/supertype 关系不适用。因为这就是泛型的定义方式。当 'reads' 和 'writes' 都可能发生时,它是正确的方差。即使在例如写入不可能发生,编译器不知道,因此强制不变性。

? extends 是 java-ese 因为:我 想要 协方差。这就是为什么这样做的原因。