Kotlin 用子类型覆盖乐趣
Kotlin override fun with subtype
我在继承包含 method/fun 基类型的接口时遇到问题,我想在实现它的 class 中将其作为子类型覆盖。
到目前为止我有界面
interface IModel {
fun convert(dataModel: BaseDataModel)
}
以及 class 实施它:
class SettingsModel: IModel {
override fun convert(dataModel: BaseDataModel) {
// Conversion of models here
}
}
我还有 SettingsDataModel,它是:
class SettingsDataModel: BaseDataModel() {
}
我想要实现的是每个 class/model 实施 IModel,能够获得特定的 DataModel,例如:
class SettingsModel: IModel {
override fun convert(dataModel: SettingsDataModel) {
// Conversion of models here
}
}
无需投射。我想我不能,因为它修改了乐趣的签名,使其不是真正的覆盖。我尝试使用泛型和 generic constraints 但没有运气:
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
}
}
I guess i cant because it modifies the signature of the fun making it not a real override
你说得对,这是不可能的:Kotlin,同Java,不允许协变方法参数。两种方法 fun foo(n: Number)
和 fun foo(I: Int)
将被视为 "overloads" 而不是 "overrides"。
你应该去使用泛型。请参阅示例 here。
我在继承包含 method/fun 基类型的接口时遇到问题,我想在实现它的 class 中将其作为子类型覆盖。
到目前为止我有界面
interface IModel {
fun convert(dataModel: BaseDataModel)
}
以及 class 实施它:
class SettingsModel: IModel {
override fun convert(dataModel: BaseDataModel) {
// Conversion of models here
}
}
我还有 SettingsDataModel,它是:
class SettingsDataModel: BaseDataModel() {
}
我想要实现的是每个 class/model 实施 IModel,能够获得特定的 DataModel,例如:
class SettingsModel: IModel {
override fun convert(dataModel: SettingsDataModel) {
// Conversion of models here
}
}
无需投射。我想我不能,因为它修改了乐趣的签名,使其不是真正的覆盖。我尝试使用泛型和 generic constraints 但没有运气:
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
}
}
I guess i cant because it modifies the signature of the fun making it not a real override
你说得对,这是不可能的:Kotlin,同Java,不允许协变方法参数。两种方法 fun foo(n: Number)
和 fun foo(I: Int)
将被视为 "overloads" 而不是 "overrides"。
你应该去使用泛型。请参阅示例 here。