我在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
个对象?
答案 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
程序。