Kotlin DSL类型对返回值的推断



我试图介绍以下(简化的)DSL:

fun <T> myDsl(specFn: DslSpec<T>.() -> Unit) {
val value = DslSpec<T>().apply(specFn).fn!!()
println("value is: $value")
}
class DslSpec<T> {
internal var fn: (() -> T)? = null
fun getValue(fn: () -> T) {
this.fn = fn
}
}
fun testCase() {
myDsl {
getValue {
"abc"
}
}
}

但是仅根据getValue的返回类型无法推断出T("没有足够的信息来推断类型变量T">)。我有点明白这对编译器来说是一项非常困难的任务,但我想也许已经有一些技巧可以让这样的结构工作?

如果您使用的是Kotlin <在1.6.0中,您应该在specFn参数中添加@BuilderInference:>

fun <T> myDsl(@BuilderInference specFn: DslSpec<T>.() -> Unit) {
...
}

https://pl.kotl.in/__xy04j88

如果你使用的是版本>= 1.6.0,你应该也使用注释,或者你的声明和它们的用法都必须使用编译器参数-Xenable-builder-inference进行编译。

最新更新