【问题标题】:Kotlin/JVM compiler fails over conditional function refrencesKotlin/JVM 编译器故障转移条件函数引用
【发布时间】:2019-11-23 11:53:36
【问题描述】:

我对这段示例代码的编译错误感到有些困惑:

inline fun String.report(to: (String) -> Unit) = to(this)

fun report(message:String, logger: Logger?=null): (AsyncResult<*>) -> Unit = {
    when (it.succeeded()) {
        true -> "$message constructed".report(logger?::info ? ::print)
        false -> "$message crashed because: ${it.cause()}".report(logger?::error ? ::print)
    }
}

当我尝试编译时,我得到org.jetbrains.kotlin.codegen.CompilationException: Back-end (JVM) Internal error: Failed to generate expression: KtLambdaExpression

似乎我无法有条件地选择函数引用作为示例:

val problem: (String) -> Unit = (logger?::info ?::print) as (String) -> Unit

会导致类似的编译异常:Failed to generate expression: KtCallableReferenceExpression

是我做错了还是 Kotlin 编译器的限制?

我的环境是:

Kotlin plugin version 1.3.60-release-IJ2019.2-1
IntelliJ IDEA 2019.2.4 (Ultimate Edition)
Build #IU-192.7142.36, built on October 29, 2019
Runtime version: 11.0.4+10-b304.77 x86_64
VM: OpenJDK 64-Bit Server VM by JetBrains s.r.o
macOS 10.14.6

更新:KT-35075

多亏了@gidds 的建议,我可以得到函数引用来解决 Kotlin 编译器空能力解析问题。看看:

val method : (String) -> Unit = if (logger != null) logger!!::info else ::print

是的,我确实收到了关于冗余非空断言(!! 运算符)的警告:

Logger 类型的非空接收器上不必要的非空断言 (!!)

但是没有它,编译器拒绝编译说:

在 Logger 类型的可空接收器上只允许安全 (?.) 或非空断言 (!!.) 调用?

【问题讨论】:

    标签: intellij-idea kotlin


    【解决方案1】:

    异常类型(在 JetBrains 内部包中,org.jetbrains....)和消息('...Internal error...')都表明这是编译器中的错误。所以这是 JetBrains 的问题,而不是你的错。

    最好的办法是通过 JetBrains 在他们的跟踪系统上提出它:https://youtrack.jetbrains.com/(首先检查其他人是否已经在那里提出了这个问题。)

    这可能是间接你的错,因为试图编译碰巧遇到该错误的代码。这通常是因为您的代码在某种程度上是无效的,尽管不一定。

    在这种情况下,我对您使用的表达方式感到困惑:

    logger?::info ?::print

    Kotlin 没有 ??:: 运算符,所以我不确定你的意图。也许你会在以下方面获得更多的运气:

    if (logger != null) logger::info else ::print

    【讨论】:

    • 这个想法是,如果logger 不为空,则使用对其方法之一的引用,否则使用打印函数引用。你使用if 的例子给了我一些线索。使用显式类型注释它可以工作,但似乎暴露了另一个错误。
    猜你喜欢
    • 1970-01-01
    • 2010-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-28
    相关资源
    最近更新 更多