最佳方案处理retrofit IllegalStateException("CompletableFuture return type must be parameterized"+ " as CompletableFuture<Foo> or CompletableFuture<? extends Foo>")
发布时间:2025-01-16 23:42:45
Retrofit中使用CompletableFuture需参数化,否则会抛出IllegalStateException异常。解决方法是在接口方法的返回类型为CompletableFuture时明确指定泛型类型。通过定义CompletableFuture<String>或CompletableFuture<? extends Foo>来避免异常。处理返回结果时可以使用future.thenAccept和exceptionally方法。
问题原因
Retrofit 出现 IllegalStateException("CompletableFuture return type must be parameterized as CompletableFuture<Foo> or CompletableFuture<? extends Foo>")
的原因是因为 Retrofit 中的 CompletableFuture 需要进行参数化,即返回类型必须是 CompletableFuture<Foo>
或 CompletableFuture<? extends Foo>
形式,如果没有进行参数化,则会抛出此异常。这是因为 Retrofit 需要明确掌握异步调用的返回类型,以便正确处理响应并将其转换为相应的对象。 如果未将 CompletableFuture 进行参数化,Retrofit 将无法准确解析响应。
在 Retrofit 中,使用 CompletableFuture 时,需要确保将其返回类型进行明确的参数化,即指定泛型类型,例如 CompletableFuture<Foo>
或 CompletableFuture<? extends Foo>
。这样 Retrofit 才能正确处理异步调用的响应并将其转换为指定类型的对象。
解决方案
在Retrofit中出现"CompletableFuture return type must be parameterized as CompletableFuture
@GET("example")
CompletableFuture getExampleData();
如果希望返回任何类型的CompletableFuture,可以使用通配符:
@GET("example")
CompletableFuture extends Foo> getExampleData();
确保在定义接口方法时,正确指定CompletableFuture的泛型类型参数,这样就能避免该异常的发生。 另外,使用带有CompletableFuture返回类型的接口方法时,可以通过类似以下方式正确处理返回结果:
CompletableFuture future = service.getExampleData();
future.thenAccept(result -> {
// 处理异步返回的结果
}).exceptionally(e -> {
// 处理异常情况
return null;
});