【发布时间】:2020-05-03 06:10:36
【问题描述】:
我正在尝试在 Spring 的 TransactionTemplate 上编写 Kotlin 包装器。关键代码如下所示:
import org.springframework.stereotype.Component
import org.springframework.transaction.PlatformTransactionManager
import org.springframework.transaction.support.TransactionCallback
import org.springframework.transaction.support.TransactionTemplate
@Component
class MyTransactionHelper(
platformTransactionManager: PlatformTransactionManager
) {
private val transactionTemplate = TransactionTemplate(platformTransactionManager);
fun <T> inTransaction(block: () -> T): T {
return transactionTemplate.execute(TransactionCallback<T> { block() })
}
}
代码无法编译。这是因为Java类TransactionCallback,在Java中定义为:
@FunctionalInterface
public interface TransactionCallback<T> {
@Nullable
T doInTransaction(TransactionStatus status);
}
在 Kotlin 中被解释为返回可为空的 T - T?,但我的 inTransaction 方法返回 T。
如何更改此代码以使其编译,同时允许我的调用者使用可为空的类型作为泛型类型?
我可以这样做:
fun <T: Any> inTransaction(block: () -> T): T = transactionTemplate.execute { block() }!!
但是我的调用者将无法传递()->Int? 类型的blocks。
这是我要编译和运行的示例代码:
val helper: MyTransactionHelper = TODO()
helper.inTransaction {
if (TODO("some irrelevant condition")) 42 else null
}
【问题讨论】:
-
是否有可能创建一个指定
@NonNull属性的Intermediate类,然后在Intermediate类之上创建wrapper?
标签: generics kotlin language-interoperability