为什么这个CompletionStage代码导致编译错误?

时间:2016-05-26 14:17:45

标签: java compiler-errors java-8

我有两节课;说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>>>

我在这里做错了什么?

1 个答案:

答案 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调用中使用它。