【问题标题】:How to call Scala curry functions from Java with Generics如何使用泛型从 Java 调用 Scala curry 函数
【发布时间】:2021-02-16 07:38:35
【问题描述】:

Scala 代码具有基于柯里化函数的重试机制:

object RetryUtil {

  def retry[T](retry: Int, timeout: FiniteDuration)(exc: => T): T = {
  //
  }
}

我想从使用泛型的 Java (8) 中调用这段代码:

public class SuperService {

    public <T> T call(Data<T> data) {
     // I want to call internalCall from here, with the Scala retry mechanism from before.
    }

    private <T> T internalCall(DataWithResult<T> data) {
    }
}

应该怎么做?

谢谢。

【问题讨论】:

  • .apply,我相信。如果您不确定 Scala 代码是如何脱糖的,请反编译字节码并亲自查看。

标签: java scala generics currying scala-java-interop


【解决方案1】:

对于

private <T> T internalCall(TransactionWithResult<T> data) {
  return null;
}

private void internalCall2(TransactionWithoutResult data) {
}

试试

public <T> T call(Data<T> data) {
  RetryUtil.retry(3, new FiniteDuration(1, TimeUnit.MINUTES), () -> { internalCall2(data); return null; });

  return RetryUtil.retry(3, new FiniteDuration(1, TimeUnit.MINUTES), () -> internalCall(data));
}

Scala 中多个参数列表中的参数在 Java 中应该被视为单个参数列表的参数。

Scala 和 Java 函数应该可以互换(从 Scala 2.12 开始)

How to use Java lambdas in Scala (https://stackoverflow.com/a/47381315/5249621)

按名称参数=&gt; T 应被视为无参数函数() =&gt; T

我假设Data 实现了TransactionWithResultTransactionWithoutResult,所以Data 可以在预期TransactionWithResultTransactionWithoutResult 的地方使用,否则代码应该被修复。

【讨论】:

  • 谢谢!如果我想重试的方法internalCall返回void?
  • 详细说明 - 我有一个额外的方法,如internalCall,我们称之为internalCall2,定义为private void internalCall(DataWithoutResult data),我也需要在重试时调用它,但它期望返回T。克服它的最优雅的方法是什么?谢谢。
  • @Johnny 试试RetryUtil.retry(3, new FiniteDuration(1, TimeUnit.MINUTES), () -&gt; { internalCall2(data); return null; });。如有必要,然后return null;
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-01-01
  • 1970-01-01
  • 2011-11-13
  • 1970-01-01
  • 1970-01-01
  • 2018-06-20
  • 1970-01-01
相关资源
最近更新 更多