我无法继承包含基类型方法/乐趣的接口,我想在实现它的类中重写它作为子类型。
到目前为止我有界面
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)
}
但它不起作用。有没有解决这个问题?
答案 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。