我正在嘗試介紹以下(簡化的)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"
}
}
}
但它無法T僅根據回傳的型別getValue( "Not enough information to infer type variable T" ) 進行推斷。我有點明白對于編譯器來說這可能是一項非常艱巨的任務,但我想也許已經有一些技巧可以使這樣的構造作業?
uj5u.com熱心網友回復:
如果您使用的是 Kotlin < 1.6.0 的版本,則應@BuilderInference在specFn引數中添加:
fun <T> myDsl(@BuilderInference specFn: DslSpec<T>.() -> Unit) {
...
}
https://pl.kotl.in/__xy04j88
如果您使用的版本 >= 1.6.0,則您也應該使用注解,或者您的宣告及其用法都必須使用編譯器引數進行編譯-Xenable-builder-inference。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/479642.html
上一篇:如何正確觀察MVVM中的登錄狀態
