为什么 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 因为:我 想要 协方差。这就是为什么这样做的原因。
我想做的是这样的:
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
改成 ? extends Optional<?>
; Optional<Claim>
与之兼容。
泛型类型是 不变的 ,意思是,只有完全匹配的东西,sub/supertype 关系不适用。因为这就是泛型的定义方式。当 'reads' 和 'writes' 都可能发生时,它是正确的方差。即使在例如写入不可能发生,编译器不知道,因此强制不变性。
? extends
是 java-ese 因为:我 想要 协方差。这就是为什么这样做的原因。