[英]Interface with generic type of the class implementing the interface?
擁有一個實現具有“This”類泛型類型的接口的類
有沒有辦法在沒有演員的情況下做到這一點?
簡單代碼:
interface Triggerable<This: Triggerable<This>> {
var trigger: (This) -> Unit
fun triggerNow() = trigger(this as This)
}
class Test : Triggerable<Test>{
override var trigger: (Test) -> Unit = { /*...*/ }
}
同樣稍微復雜一點:
interface TriggerInterface<T> {
val trigger: (T) -> Unit
fun triggerNow()
}
interface Triggerable<T: Triggerable<T>>: TriggerInterface<T> {
override fun triggerNow() = trigger(this as T)
}
interface Signalable<T>: TriggerInterface<T> {
var value: T
override fun triggerNow() = trigger(value)
}
class Test : Triggerable<Test>{
override val trigger: (Test) -> Unit = { /*...*/ }
}
應該可以這樣
interface TriggerInterface<T: TriggerInterface<T>> {
val trigger: (T) -> Unit
fun triggerNow()
fun getThis(): T
}
interface Triggerable<T: TriggerInterface<T>>: TriggerInterface<T> {
override fun triggerNow() = trigger(getThis())
}
class Test : Triggerable<Test>{
override fun getThis(): Test = this
override val trigger: (Test) -> Unit = { /*...*/ }
}
檢查http://www.angelikalanger.com/GenericsFAQ/FAQSections/ProgrammingIdioms.html#FAQ206
我個人還建議您重新考慮是否真的需要 TriggerInterface 和 Triggerable (其中一個繼承自另一個)。
調用override fun triggerNow() = trigger(this as T)
您正試圖將Triggerable<T>
為T
這就是編譯器警告您未經檢查的強制轉換的原因
有
val trigger: (TriggerInterface<T>) -> Unit
將允許您在不進行轉換的情況下調用觸發器
override fun triggerNow() = trigger(this)
實際執行
override val trigger: (Test) -> Unit = { /*...*/ }
您需要一個Test
實例來傳遞觸發器內部,該實例尚未在代碼中的任何位置聲明
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.