Kotlin 用子类型覆盖 fun

nsL*_*nsL 5 generics inheritance kotlin kotlin-generics

我在继承包含基类型的方法/乐趣的接口时遇到问题,我想将其重写为实现它的类中的子类型。

到目前为止我已经有了界面

interface IModel {
    fun convert(dataModel: BaseDataModel)
}
Run Code Online (Sandbox Code Playgroud)

以及实现它的类:

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

    }
}
Run Code Online (Sandbox Code Playgroud)

我还有 SettingsDataModel 它是:

class SettingsDataModel: BaseDataModel() {
}
Run Code Online (Sandbox Code Playgroud)

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

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

    }
}
Run Code Online (Sandbox Code Playgroud)

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

interface IModel {
    fun <T :BaseDataModel>convert(dataModel: T)
}
Run Code Online (Sandbox Code Playgroud)

但它不起作用。有解决这个问题的方法吗?

fal*_*fal 7

这个怎么样?

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

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

    }
}
Run Code Online (Sandbox Code Playgroud)