当前位置: 首页 > 知识库问答 >
问题:

将泛型Java回调转换为静态编程语言时为空

孔砚
2023-03-14

我正在尝试在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
    }

共有1个答案

邢英奕
2023-03-14
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?