4

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

到目前为止我有界面

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

    }
}

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

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

但它不工作。有什么解决方法吗?

4

2 回答 2

3

这个怎么样?

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

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

    }
}
于 2017-09-07T20:26:18.930 回答
1

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

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

你应该去使用泛型。请参阅此处的示例。

于 2017-09-07T20:35:01.510 回答