使用具体类型参数覆盖函数

时间:2018-03-08 23:30:54

标签: kotlin

您好我想知道为什么以下示例不起作用

abstract class BaseClass {

}

class ConcretClasOne : BaseCalculator {


}

class ConcretClasTwo : BaseCalculator {


}

abstract class BaseRun {

    abstract fun run(param: BaseClass): Int
}

class ConcretRun : BaseRun {

    override fun run(param: ConcretClasOne): Int {

        return 0
    }
}

这会向我显示一条消息run overrides nothing

我认为kotlin无法匹配抽象类和具体实现,但是还有其他替代方法可以模拟这种行为,具体类ConcretRun中的run方法应该得到一个具体的参数ConcretClasOne

1 个答案:

答案 0 :(得分:3)

泛型

使用泛型,可以使基类具有扩展基类的类型,以便run方法可以使用该类型。

abstract class BaseClass {

}

class ConcretClasOne: BaseCalculator {


}

class ConcretClasTwo: BaseCalculator {


}

abstract class BaseRun<T: BaseClass> {
    abstract fun run(param: T): Int
}

class ConcretRun: BaseRun<ConcretClasOne> {
    override fun run(param: ConcretClasOne): Int {
        return 0
    }
}

为什么你的代码不起作用

目前您尝试使用更具体的类型覆盖方法,但由于更通用的基本方法可以接受更多类型,因此更具体的方法无法覆盖它。