【问题标题】:Kotlin override fun with subtypeKotlin 用子类型覆盖 fun
【发布时间】:2018-02-16 15:46:36
【问题描述】:

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

到目前为止我有界面

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)
}

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

【问题讨论】:

  • 旁注:你不能限制函数参数(因为使用接口实现的人不能使用它)但你可以更具体地说明你的返回类型(例如:在接口返回是Any 但你可以在 impl 中做 Int)

标签: generics inheritance kotlin kotlin-generics


【解决方案1】:

这个怎么样?

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

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

    }
}

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多