簡體   English   中英

具有實現接口的類的泛型類型的接口?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM