如何将Function0转为Supplier类型?Scala代码类型不匹配报错求助
问题解决:Scala Function0转Java Supplier类型不匹配
报错原因
你的代码里() => { ... }的代码块返回的是Scala的Unit类型(无返回值),而Resilience4j的Decorators.ofSupplier需要的是Java的Supplier[T]接口。虽然Scala 2.12+支持Java与Scala函数的自动转换,但Function0[Unit]会被自动转为Runnable(对应Java无返回值的接口),而非Supplier(要求有返回值),因此出现类型不匹配错误。
解决方案
方案1:让代码块返回具体类型(推荐)
如果业务逻辑允许,让函数块返回一个非Unit的类型,这样Scala会自动将Function0[T]转为Supplier[T]。
比如直接返回determinationService.callService()的Try结果:
protected def helper(): Unit = { Decorators.ofSupplier { () => determinationService.callService() } .withRetry(getTaxResilience.getDefaultRetryInstance()) .get() }
如果需要处理match分支,确保每个分支都有返回值,比如返回Option[GetTaxResponse]:
protected def helper(): Unit = { Decorators.ofSupplier { () => determinationService.callService() match { case Success(getTaxResponse) => Some(getTaxResponse) case Failure(exception) => // 这里可以添加异常处理逻辑,比如日志打印 None } } .withRetry(getTaxResilience.getDefaultRetryInstance()) .get() }
方案2:显式转换为Supplier[Void](无返回值场景)
如果确实不需要返回值,需要显式将Scala的Function0转为Java的Supplier[Void],并手动返回null(Java的Void类型只能返回null):
首先导入Scala-Java互操作工具类:
import scala.compat.java8.FunctionConverters._
然后修改代码:
protected def helper(): Unit = { Decorators.ofSupplier( (() => { determinationService.callService() match { case Success(getTaxResponse) => case Failure(exception) => } null }).asJavaSupplier ) .withRetry(getTaxResilience.getDefaultRetryInstance()) .get() }
内容的提问来源于stack exchange,提问作者Nick
相关产品推荐
相关产品推荐

