Kotlin中如何获取Void值以适配要求返回Void的函数?
Kotlin中使用java9 CompletableFuture的exceptionally方法返回值问题解决
在Kotlin中使用java9.util.concurrent.CompletableFuture时,其exceptionally方法要求接收一个(Throwable) -> Void!类型的函数,该函数会在调用completeExceptionally时触发。
尝试以下写法时:
myCompletableFuture.exceptionally { exception -> doSomethingWith(exception) }
IDE会提示返回的是Unit,不符合Void!的类型要求。
改用以下写法后:
myCompletableFuture.exceptionally { exception -> doSomethingWith(exception) val returnValue: Void by Delegates.notNull() returnValue }
执行时会抛出异常:
java.lang.IllegalStateException: Property returnValue should be initialized before get. at kotlin.properties.NotNullVar.getValue(Delegates.kt:62)
不需要完全避免使用CompletableFuture,有几种可行的解决方式:
- 直接返回null:Java中的
Void类型本身没有实例,只能用null表示,而Void!是Kotlin对其的可空类型适配,直接返回null即可满足要求:
myCompletableFuture.exceptionally { exception -> doSomethingWith(exception) null }
- 显式指定返回类型:如果IDE类型推断出现问题,可以在lambda中显式声明返回类型,避免歧义:
myCompletableFuture.exceptionally { exception: Throwable -> doSomethingWith(exception) null as Void? }
另外补充:如果项目环境允许,优先使用标准Java 8+的java.util.concurrent.CompletableFuture,它与Kotlin的兼容性更好,exceptionally方法的返回值逻辑更贴合Kotlin的类型系统,不会出现Void相关的适配问题。
内容的提问来源于stack exchange,提问作者Alfredo Tostón
相关产品推荐
相关产品推荐

