将一段代码从Java传递给Scala对象

时间:2016-09-09 20:47:03

标签: java scala

我在scala中有一个通用实用程序来重试某段代码逻辑n次。

RetryCode.scala

object RetryCode {
    def retry[T](timesRetry: Int)(block: => T): T = {
        def doBlock() = block
        breakable {
            for (i <- 0 until timesRetry) {
                try {
                    ...
                    doBlock()
                } catch {
                    ...
                }
            }
        }
    }
}

Scala中的测试单位:

class RetryCodeTest {
    test("success on 1st retry") {
        var i = 0
        val result = retry(5) {
          i = i + 1
          i
        }
        assert(result==1)
    }
}

我想将此功能扩展到Java程序

private void myMethod(int x) {
    try {
        // Code block to Retry 10 times
        ...
    } catch(Exception ex) {
        System.out.println("Error: " + ex.getMessage());
    }
}

如何将Java 7代码块发送到RetryCode中的Scala个对象?

2 个答案:

答案 0 :(得分:0)

Java看到的retry签名是<T> T retry(int timesRetry, scala.Function0<T> block)。所以你需要实例化一个Function0,但是直接在Java中扩展它是行不通的;相反,你想要

RetryCode.retry(10, new scala.runtime.AbstractFunction0<Integer> {
  @Override
  public Integer apply() { return something; }
});

(至少如果我没记错的话,静态方法是在RetryCode上生成的)。

请注意,通常您不能只假设Scala API可以从Java合理调用;你可能需要为它编写一个包装器(在Scala中)。

答案 1 :(得分:0)

我在Java 7重新编写了Scala程序。