Интерфейс с типом generi c класса, реализующего интерфейс? - PullRequest
1 голос
/ 26 февраля 2020

Наличие класса, реализующего интерфейс с обобщенным c типом класса «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 = { /*...*/ }
}

Ответы [ 2 ]

3 голосов
/ 26 февраля 2020

Должно быть возможно вот так

 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 (где одно наследуется от другого).

0 голосов
/ 26 февраля 2020

При вызове 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 для прохода внутрь триггера, который еще нигде не объявлен в вашем коде

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...