gpt4 book ai didi

Java CompletionStage 到 CompletionStage 类型丢失

转载 作者:行者123 更新时间:2023-12-02 12:32:37 25 4
gpt4 key购买 nike

假设我有这个方法:

public CompletionStage<SomeClass> getData() {
CompletableFuture<SomeClass> future = new CompletableFuture<>();

return CompletableFuture.runAsync(() -> {
// Fetch data from some source
// Then either
// future.complete(data);
// or fail
// future.completeExceptionally(e);
});

return future;
}

现在我想要一个方法,调用 getData ,进行操作,但随后返回 CompletionStage<Either<ErrorResponse, Data>>

public CompletionStage<Either<ErrorResponse, Data>> modifyData() {
return getData()
.thenCompose(d -> CompletableFuture.completedFuture(Either.right(d)))
.exceptionally(e -> Either.left(ErrorResponse.create(e)));
}

当我这样做时, exceptionally 内的类型丢失了,编译器认为我正在返回类型 Either<Object, Data> .

如果我将该代码更改为:

public CompletionStage<Either<ErrorResponse, Data>> modifyData() {
CompletableFuture<Either<ErrorResponse, Data>> future = new CompetableFuture<>();

CompletableFuture.runAsync(() -> {
getData()
.thenCompose(d -> future.complete(Either.right(d)));
.exceptionally(e ->
future.complete(Either.left(ErrorResponse.create(e)))
});

return future;
}

然后就可以正常工作了。为什么类型丢失了?

最佳答案

你有

public CompletionStage<Either<ErrorResponse, Data>> modifyData() {
return getData()
.thenCompose(d -> CompletableFuture.completedFuture(Either.right(d)))
.exceptionally(e -> Either.left(ErrorResponse.create(e)));
}

thenCompose 是一个泛型方法,但您没有为 Java 提供足够的类型信息来推断您需要其类型参数 U绑定(bind)到Either<ErrorResponse, Data> 。调用exceptionally (即使它是通用的)也无法将类型信息反馈给 thenCompose 的调用.

目前,它推断 Object对于 Either的第一个类型参数。所以thenCompose返回 CompletionStage<Either<Object, Data>> 。这会传播到 exceptionally 。自 CompletionStage<Either<Object, Data>>不是CompletionStage<Either<ErrorResponse, Data>> ,它的返回值类型无效。

您可以通过提供显式类型参数来添加必要的类型信息。

public CompletionStage<Either<ErrorResponse, Data>> modifyData() {
return getData()
.<Either<ErrorResponse, Data>>thenCompose(d -> CompletableFuture.completedFuture(Either.right(d)))
.exceptionally(e -> Either.left(ErrorResponse.create(e)));
}

或更接近有问题的调用

public CompletionStage<Either<ErrorResponse, Data>> modifyData() {
return getData()
.thenCompose(d -> CompletableFuture.completedFuture(Either.<ErrorResponse, Data>right(d)))
.exceptionally(e -> Either.left(ErrorResponse.create(e)));
}

现在 Java 不必尝试和猜测。它知道你的意思。

或者,我会使用 CompletableFuture#handle 处理异常情况。

return getData()
.handle((d, e) -> {
if (e == null) {
return Either.right(d);
}
return Either.left(ErrorResponse.create(e));
});
}

类型信息是独立的。剩下的主要是意见问题。

关于Java CompletionStage 到 CompletionStage<Either> 类型丢失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45221337/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com