如何使用泛型从 Java 调用 Scala curry 函数
How to call Scala curry functions from Java with Generics
A 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, new FiniteDuration(1, TimeUnit.MINUTES), () -> internalCall(data));
}
Scala 中来自多个参数列表的参数应该在 Java 中被视为单个参数列表的参数。
Scala 和 Java 函数应该可以互换(自 Scala 2.12 起)
()
By-name 参数 => T
应被视为 no-arg 函数 () => T
.
我假设 Data
实现了 TransactionWithResult
和 TransactionWithoutResult
,所以 Data
可以用在需要 TransactionWithResult
或 TransactionWithoutResult
的地方,否则代码应该是固定的。
A 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, new FiniteDuration(1, TimeUnit.MINUTES), () -> internalCall(data));
}
Scala 中来自多个参数列表的参数应该在 Java 中被视为单个参数列表的参数。
Scala 和 Java 函数应该可以互换(自 Scala 2.12 起)
By-name 参数 => T
应被视为 no-arg 函数 () => T
.
我假设 Data
实现了 TransactionWithResult
和 TransactionWithoutResult
,所以 Data
可以用在需要 TransactionWithResult
或 TransactionWithoutResult
的地方,否则代码应该是固定的。