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,因为如果泛型类型参数定义得很好,就不会有问题