我正在尝试在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);
}
在静态编程语言中解释为返回可空的T-T?
,但我的inTransaction
方法返回T
。
如何更改此代码以使其可编译,同时允许调用方使用可为null的类型作为泛型类型?
我可以做这样的事情:
fun <T: Any> inTransaction(block: () -> T): T = transactionTemplate.execute { block() }!!
但是我的调用者将无法传递块
类型为()-
下面是我要编译和运行的示例代码:
val helper: MyTransactionHelper = TODO()
helper.inTransaction {
if (TODO("some irrelevant condition")) 42 else null
}
fun <T : Any> inTransaction(block: () -> T?): T? {
return transactionTemplate.execute(TransactionCallback<T> { block() })
}
(:任意绑定可选)。请注意,由于差异,
()-
然而
代码无法编译。这是因为Java类TransactionCallback在Java中定义为。。。
在静态编程语言中被解释为返回可为空的T-T?,但我的inTransaction方法返回T。
不正确;问题是
TransactionTemplate.execute
返回T?
,而不是TransactionCallback.doInTransaction
。如果执行
实际上保证不会返回null
,而block
没有(我认为从留档来看是真的,但不确定),那么只需在原始代码中添加一个强制转换:
@Suppress("UNCHECKED_CAST")
fun <T> inTransaction(block: () -> T): T {
return transactionTemplate.execute(TransactionCallback<T> { block() }) as T
}
我正在尝试将我的Java类转换为静态编程语言,这是Java代码: 这就是我把它转换成的: Lambda符号似乎根本不起作用,或者我就是搞不懂。我在Kotlin中发现的所有双函数示例都直接返回这样的值 双函数{名称,年龄- 这在语法上是正确的,但在返回某些内容之前,我需要一些额外的逻辑。出现两条错误消息: > 类型不匹配。必需:单位,找到:字符串 但我确实想返回一个字符串,我还显式声明了它。但是,还
我想在google api中更改我的标记。所以我在Picasso中使用了“getBitmap”功能,但此功能返回“位图?” .icon(位图描述符从位图(获取位图(user_URL[i])) - 所以,问题是: 类型不匹配错误(需要:位图,找到:位图?) java.lang.NullPointerException:图像在同一行中不能为空 我如何在科特林解决这个问题? 法典: 私人乐趣得到位图(网
函数应将类型擦除列表转换为,即
如果转换过程必须通过汇编语言,即 高级语言====>汇编语言====>目标代码/机器代码, 那么谁把这种高级语言转换成汇编语言,它有什么用?
我的名单如下{(“a”,1),(“b”,2),(“c”,3),(“a”,4)} 我想将其转换为如下列表映射{("a"(1,4)),("b",(2)),("c",(3))} 也就是说,对于a,我们有一个1和4的列表,因为键是相同的。 Kotlin中如何将列表转换为地图中的答案?只显示唯一的价值(而不是像我一样的重复)。 我在Kotlin尝试了 但似乎不起作用。我怎样才能在 Kotlin 中做到这一点
我试图用OkHttp和Cucumber在静态编程语言中设置一个Spring启动项目,并且在运行Cucumber任务时遇到以下错误。如何修复? 还有build gradle kts片段 我看到了这个错误https://github.com/square/okio/issues/647看起来可能是它,并修复了这个build.gradle,我如何将其翻译为kotlinbuild.gradle.kts?