Kotlin 具有实现接口的类的泛型类型的接口?

Kotlin 具有实现接口的类的泛型类型的接口?,kotlin,Kotlin,具有实现该类泛型类型接口的类 有没有一种不用石膏的方法 简单代码: interface Triggerable<This: Triggerable<This>> { var trigger: (This) -> Unit fun triggerNow() = trigger(this as This) } class Test : Triggerable<Test>{ override var trigger: (Test) -&

具有实现该类泛型类型接口的类

有没有一种不用石膏的方法

简单代码:

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 = { /*...*/ }
}
调用override fun triggerNow=triggerthis作为T您试图将Triggerable强制转换为T,这就是为什么编译器会警告您有关未选中强制转换的原因

拥有

    val trigger: (TriggerInterface<T>) -> Unit
实际执行

override val trigger: (Test) -> Unit = { /*...*/ }
您需要一个Test实例来传递触发器的内部,而触发器在代码中的任何地方都没有声明

调用override-fun-triggerNow=trigger当您试图将Triggerable强制转换为T时,编译器会警告您未选中强制转换

拥有

    val trigger: (TriggerInterface<T>) -> Unit
实际执行

override val trigger: (Test) -> Unit = { /*...*/ }

您需要一个Test实例来通过触发器内部,而触发器在代码中的任何地方都没有声明,但应该可以像这样

 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 = { /*...*/ }
 }
检查


我个人还建议您重新考虑是否真的需要TriggerInterface和TriggerTable,其中一个继承自另一个

应该是这样的

 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 = { /*...*/ }
 }
检查


我个人还建议您重新考虑是否真的需要TriggerInterface和TriggerTable,其中一个继承自另一个

这是需要的,因为有另一个接口触发另一个值我接受了你的答案,因为这是最好的解决方案,但不是我想要的。我结束了使用cast,因为如果泛型类型参数定义得很好,就没有问题了。这是必要的,因为有另一个接口触发另一个值。我接受了你的答案,因为这是最好的解决方案,但不是我想要的。我结束了使用cast,因为如果泛型类型参数定义得很好,就不会有问题