所以我试着在 map 上注册一些函数,代码可以像这样恢复:

private val things = mutableMapOf<String, Any>()

fun put(name: String, value: Any) {
    things[name] = value
}

fun main() {
    put("foo") { a: String, b: (() -> String) ->
        println(a + b())
    }
}

(Code on Kotlin Playground)

但是Kotlin解析器抱怨我在第8行和第9行得到的c类型:

Unresolved reference: a
Unexpected tokens (use ';' to separate expressions on the same line)
Unresolved reference: a
Unresolved reference: b

这看起来像是个虫子,但我不确定.

当然,这可以绕过我在register(String, () -> String) -> Unit中指定value的类型,但这是API,我无法访问它.

这也可以通过使用Function0<String>来解决,但是为什么它不能使用更"Kotlin"的语法呢?

推荐答案

删除函数类型周围的圆括号对我很有效:

put("foo") { a: String, b: () -> String ->
    println(a + b())
}

我也同意这很奇怪.您可以将括号放在String左右,但不能放在() -> String左右.这也适用于匿名函数文字:

put("foo", fun(a: String, b: (() -> String)) {
    
})

语言规范中的syntax确实说明type可以是parenthesizedType:

type:
[typeModifiers] (functionType | parenthesizedType | nullableType | typeReference | definitelyNonNullableType)

也许解析器中有一些怪癖,导致解析失败……

Kotlin相关问答推荐

在没有外部 map 的情况下转换列表项

Fleet无法从构建文件自动重新加载更改错误'

Groovy Gradle文件的Kotlin类似功能

Kotlin编译器如何决定是否可以在任何给定点调用Suspend方法?

Spring Boot 3:为Kotlin中的TestRestTemplate配置读取超时

同时也是一个字符串的 Kotlin 枚举

为什么 Kotlin 在将协变类型参数转换为不变类型参数时会产生 Unchecked Cast 警告?

mutableStateOf 和 mutableStateListOf 有什么区别?

如何在 Spring Boot 3 中为内部类提供运行时提示

创建首选项屏幕时找不到androidx.preference.PreferenceScreen

在构造函数中仅注入某些参数

Foo::class.java 和 Foo::javaClass 有什么区别?

更新到版本4.10.1/4.10.2后 Gradle 同步失败

Kapt不适用于Android Studio 3.0中的AutoValue

如何在Kotlin中使用ViewModelProviders

使用导航组件在BottomNavigationView中传递参数

如何为 Java 调用者声明返回类型为void的 Kotlin Lambda?

uses-sdk:minSdkVersion 16 不能小于库中声明的版本 23

Android Jetpack Compose 中的文本渐变

Android Compose 生产准备好了吗?