【发布时间】: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