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