如何使用泛型从Java调用Scala咖喱函数

问题描述

Scala 代码具有基于currying函数的重试机制:

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) {
    }
}

应该怎么做?

谢谢。

解决方法

对于

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,() -> internalCall(data));
}

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

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

How to use Java lambdas in Scalahttps://stackoverflow.com/a/47381315/5249621

按名称参数=> T应该被视为无参数函数() => T

我假设Data实现了TransactionWithResultTransactionWithoutResult,所以可以在需要DataTransactionWithResult的地方使用TransactionWithoutResult,否则代码应该是固定的。