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已经提出的那样。 在这里看到一个例子。