繁体   English   中英

为什么返回类型不是我在这里编码的?

[英]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>>

我想解决这个问题,我会写这样的东西来投射我传递给 Object 的 function:

    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, ? extends Object>而不是Function<Bill,Optional<String>>

还有什么我可以在这里做的吗? 可以像蛮力一样

Function<Bill,Optional<String>> hasClaim =
            b -> toClaim.apply(b).isPresent()
                ? emptyStrOpt.get()
                : Optional.of("No claim");

但这似乎有点笨拙,对Bill的每个可空成员重复相同的逻辑

做那个? extends Optional<?> 改为? extends Optional<?> Optional<Claim>与此兼容。

Generics 类型是不变的,这意味着,只有确切的东西匹配,子/超类型关系不适用。 因为这就是 generics 的定义方式。 当“读取”和“写入”都可能发生时,这是正确的差异。 即使在无法发生写入的情况下,编译器也不知道这一点,因此会强制执行不变性。

? extends ? extends是java-ese:我想要协方差。 因此,为什么这有效。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM