在下面的代碼中,即使指定為背景關系接收者并且它有一個名為的call成員,Animal也無法決議的成員。Catcall
interface Animal { val call: String }
object Cat : Animal { override val call: String = "Meow" }
object Dog : Animal { override val call: String = "Woof" }
fun <T : Animal> acquireAnimal(animal: T, block: context(T) () -> Unit) {
block(animal)
}
fun main() {
acquireAnimal(Cat) {
call
}
}
當我this在 lambda 中鍵入時,IDE 似乎建議型別this為Any?.

如果我對沒有通用背景關系接收器的函式做同樣的事情,那么它似乎得到了正確的型別。

這是設計上的限制還是錯誤?
uj5u.com熱心網友回復:
您無法訪問的事實call是一個錯誤,已在Kotlin 1.7.20中修復。
較低版本的解決方法是:
sealed interface TypeWrapper<out A> {
object IMPL: TypeWrapper<Nothing>
}
fun <T: Animal> acquireAnimal(animal: T, block: context(T) (TypeWrapper<T>) -> Unit) {
block(animal, TypeWrapper.IMPL)
}
fun main() {
acquireAnimal(Cat) {
val x = call // works!
}
}
this但是,這不起作用的事實是有意的。背景關系接收者不會改變this. 由于您處于全域函式中,this因此沒有任何意義,并且背景關系接收器的存在不會改變這一點。
通常,要訪問背景關系接收器本身,您需要this通過為背景關系接收器附加生成的標簽來進行限定:
context(Foo)
fun foo() {
val x = this@Foo
}
但是,您的背景關系接收器是型別引數,因此根據此處的規則,我認為不會為背景關系接收器生成標簽。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/525288.html
標籤:科特林仿制药
