首页 文章

Kotlin用子类型覆盖乐趣

提问于
浏览
2

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

到目前为止我有接口

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 回答

  • 2

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

    你是对的,这是不可能的: Kotlin ,与Java相同,不允许协变方法参数 . 两种方法 fun foo(n: Number)fun foo(I: Int) 将被视为"overloads"而不是"overrides" .

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

  • 2

    这个怎么样?

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

相关问题