我有两节课;说A和B;两者都返回CompletionStage。
B类代码:
class B {
public CompletionStage<Optional<Map<String, Object>>> m1(SampleObject1 obj) {
return CompletableFuture.supplyAsync(() -> dosomething(obj))
.thenApplyAsync(results ->
Optional.ofNullable((results.length == 1) ? results : null)
);
}
}
A类代码:
class A {
public CompletionStage<Optional<SampleObject2>> m2(Optional<DynamicForm> dynamicForm) {
CompletionStage<DynamicForm> promiseOfFormData = CompletableFuture.supplyAsync(() -> dynamicForm.get());
CompletionStage<Optional<Map<String, Object>>> c = promiseOfFormData.thenApplyAsync(
data -> b.m1(new SampleObject1(data.get("key1"), data.get("key2")))
);
return something.....;
}
}
但是,它在运行时抛出以下错误:
inference variable U has incompatible bounds
equality constraints: java.util.Optional<java.util.Map<java.lang.String,java.lang.Object>>
lower bounds: java.util.concurrent.CompletionStage<java.util.Optional<java.util.Map<java.lang.String,java.lang.Object>>>
我在这里做错了什么?
答案 0 :(得分:2)
您的退货类型有问题:
b.m1(new SampleObject1(data.get("key1"), data.get("key2")))
从CompletionStage<Optional<Map<String, Object>>>
中的方法签名返回B
,所以
data -> b.m1(new SampleObject1(data.get("key1"), data.get("key2")))
的类型为Function<DynamicForm,CompletionStage<Optional<Map<String, Object>>>>
,以下为
promiseOfFormData.thenApplyAsync(
data -> b.m1(new SampleObject1(data.get("key1"), data.get("key2")))
);
因此,类型为CompletionStage<CompletionStage<Optional<Map<String, Object>>>>
,与目标类型CompletionStage<Optional<Map<String, Object>>>
不兼容。您遇到的错误是计算目标类型的边界。
你应该做的是使用CompletionStage#thenComposeAsync
,它是为那些也返回CompletionStage
的函数设计的:
CompletionStage<Optional<Map<String, Object>>> c = promiseOfFormData.thenComposeAsync(
data -> b.m1(new SampleObject1(data.get("key1"), data.get("key2")))
);
或者,您可以重写m1
以不创建CompletionStage
但只是执行计算,然后像以前一样在thenApplyAsync
调用中使用它。