【问题标题】:Why isn't the return type what I have coded here?为什么返回类型不是我在这里编码的?
【发布时间】:2022-01-22 19:54:57
【问题描述】:

我想做的是这样的:

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 的函数:

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

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

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

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

【问题讨论】:

    标签: java generics functional-programming


    【解决方案1】:

    改为? extends Optional&lt;?&gt;Optional&lt;Claim&gt; 与之兼容。

    泛型类型是invariant,意思是,只有确切的东西匹配,子/超类型关系不适用。因为这就是泛型的定义方式。当“读取”和“写入”都可能发生时,这是正确的差异。即使在环境中,例如写不可能发生,编译器不知道,因此,强制不变。

    ? extends 是 java 语言,用于:我 想要 协方差。这就是为什么这样做的原因。

    【讨论】:

      猜你喜欢
      • 2022-07-07
      • 1970-01-01
      • 2012-01-30
      • 2015-04-18
      • 1970-01-01
      • 2015-03-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多