Kotlin覆盖子类型的乐趣

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

到目前为止,我有界面

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

但它不工作。 任何解决这个问题?

这个怎么样?

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

我想我不能,因为它修改了有趣的签名,使其不是一个真正的重写

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

那么你应该按照惯例去做,正如fal已经提出的那样。 在这里看到一个例子。