Generics 将通用Java回调转换为Kotlin时的可空性

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

我正试图在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() })
    }
}

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
}