Kotlin DSL - 返回值的类型推断
Kotlin DSL - type inference on returned value
我正在尝试介绍以下(简化的)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,您应该将 @BuilderInference
添加到 specFn
参数:
fun <T> myDsl(@BuilderInference specFn: DslSpec<T>.() -> Unit) {
...
}
如果您使用的版本 >= 1.6.0,您也应该使用注释,或者您的声明及其用法都必须使用编译器参数 -Xenable-builder-inference
.
我正在尝试介绍以下(简化的)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,您应该将 @BuilderInference
添加到 specFn
参数:
fun <T> myDsl(@BuilderInference specFn: DslSpec<T>.() -> Unit) {
...
}
如果您使用的版本 >= 1.6.0,您也应该使用注释,或者您的声明及其用法都必须使用编译器参数 -Xenable-builder-inference
.