Kotlin用子类型覆盖乐趣

时间:2017-09-07 20:02:58

标签: generics inheritance kotlin kotlin-generics

我无法继承包含基类型方法/乐趣的接口,我想在实现它的类中重写它作为子类型。

到目前为止我有界面

interface IModel {
    fun convert(dataModel: BaseDataModel)
}

实施它的课程:

class SettingsModel: IModel {
    override fun convert(dataModel: BaseDataModel) {
        // Conversion of models here

    }
}

我还有SettingsDataModel:

class SettingsDataModel: BaseDataModel() {
}

我想要实现的是每个实现IModel的类/模型,能够获得特定的DataModel,如:

class SettingsModel: IModel {
    override fun convert(dataModel: SettingsDataModel) {
        // Conversion of models here

    }
}

无需投射。我想我不能因为它修改了乐趣的签名使它不是真正的覆盖。我尝试使用泛型和generic constraints,但没有运气:

interface IModel {
    fun <T :BaseDataModel>convert(dataModel: T)
}

但它不起作用。有没有解决这个问题?

2 个答案:

答案 0 :(得分:2)

这个怎么样?

interface IModel<T : BaseDataModel> {
    fun convert(dataModel: T)
}

class SettingsModel: IModel<SettingsDataModel> {
    override fun convert(dataModel: SettingsDataModel) {
        // Conversion of models here

    }
}

答案 1 :(得分:2)

  

我想我不能因为它修改了乐趣的签名而不是真正的覆盖

你是对的,这是不可能的: Kotlin 与Java 相同,不允许协变方法参数。两种方法fun foo(n: Number)fun foo(I: Int)将被视为“重载”而非“覆盖”。

你应该使用泛型。查看示例here