0

我会有一个 Scala 问题。我在使用弹性4j 库时有以下代码。该代码在 Scala 12 中就像一个魅力,但我的项目,一个客户端库也使用 Scala-Cross 编译到 Scala 11。在 Scala 11 下构建它时,出现以下错误。任何人都知道应该如何在 Scala 11 中编写它以进行编译?

import io.github.resilience4j.retry.Retry
import java.util.function.{Supplier, Function => JavaFunction}
val supplier: Supplier[List[Endpoint]] = () => getEndpoints
val decoratedSupplier = Retry.decorateSupplier(retry, supplier)
val result = io.vavr.control.Try.ofSupplier(decoratedSupplier)
  .onSuccess { endpoints => endpoints }
    .onFailure { failure =>
      // handle failure
    }.get()

在 Scala 11 中,我收到以下错误:

[Error] ServiceDiscoveryClient.scala:38: type mismatch;
 found   : () => List[Endpoint]
 required: java.util.function.Supplier[List[Endpoint]]
[Error] ServiceDiscoveryClient.scala:41: missing parameter type
[Error] ServiceDiscoveryClient.scala:97: type mismatch;
 found   : () => List[Endpoint]
 required: java.util.function.Supplier[List[Endpoint]]
four errors found

有任何想法吗?谢谢!

4

1 回答 1

2

在 Scala 2.11 中,您需要-Xexperimental编译器选项来支持将 lambdas 作为 SAM 类型传递,例如java.util.function.Supplier. 在 2.12 中默认启用。您可以添加此选项,也可以添加scala-java8-compat依赖项和

import scala.compat.java8.FunctionConverters._

...
val supplier: Supplier[List[Endpoint]] = (() => getEndpoints).asJava

(asJava中使用的 lambda 也可能需要result)。

于 2020-02-26T09:50:28.470 回答