Generics 将通用Java回调转换为Kotlin时的可空性
我正试图在Spring的Generics 将通用Java回调转换为Kotlin时的可空性,generics,kotlin,language-interoperability,Generics,Kotlin,Language Interoperability,我正试图在Spring的TransactionTemplate上编写一个Kotlin包装器。关键代码如下所示: import org.springframework.stereotype.Component import org.springframework.transaction.PlatformTransactionManager import org.springframework.transaction.support.TransactionCallback import org.sp
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() })
}
}
fun <T: Any> inTransaction(block: () -> T): T = transactionTemplate.execute { block() }!!
在Kotlin中被解释为返回可为null的T-T?
,但我的内部操作
方法返回T
如何更改此代码以使其可编译,同时允许调用方使用可空类型作为泛型类型
我可以这样做:
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() })
}
}
fun <T: Any> inTransaction(block: () -> T): T = transactionTemplate.execute { block() }!!
是否有可能创建一个指定
@NonNull
属性的中间类
,然后在中间类
上创建包装器
?
fun <T : Any> inTransaction(block: () -> T?): T? {
return transactionTemplate.execute(TransactionCallback<T> { block() })
}
@Suppress("UNCHECKED_CAST")
fun <T> inTransaction(block: () -> T): T {
return transactionTemplate.execute(TransactionCallback<T> { block() }) as T
}