Generics 您能否从抽象类继承方法并将其泛型类型更改为特定类型?
例如,我希望从基类继承一个函数,并希望其参数与某个基于继承的类而更改的类相匹配 基类Generics 您能否从抽象类继承方法并将其泛型类型更改为特定类型?,generics,inheritance,kotlin,Generics,Inheritance,Kotlin,例如,我希望从基类继承一个函数,并希望其参数与某个基于继承的类而更改的类相匹配 基类 abstract class BaseList { abstract fun <T : BaseItem> addItem(item: T) } 注意超市的商品 我不确定泛型是这里最好的方法;它应该实现一个接口吗?是否有其他方法可以实现这一点,例如基于类实现函数的参数 明确地说,上面的代码是有效的,但在我看来这是一个糟糕的做法。如果我错误地向函数传递了我想要的类型以外的另一个类型,该类型也
abstract class BaseList {
abstract fun <T : BaseItem> addItem(item: T)
}
注意超市的商品
我不确定泛型是这里最好的方法;它应该实现一个接口吗?是否有其他方法可以实现这一点,例如基于类实现函数的参数
明确地说,上面的代码是有效的,但在我看来这是一个糟糕的做法。如果我错误地向函数传递了我想要的类型以外的另一个类型,该类型也是BaseItem的子类型,因此被接受,会发生什么情况?看起来您想要的是“自我类型”。不幸的是,这在Kotlin中不可用。(到目前为止,一直在添加它们。)
本文讨论了一些解决方法
特别是,您可以通过参数化基类,使用该参数类型作为函数的参数类型,然后在子类中提供(或进一步限制)该类型来解决它。这有点尴尬(特别是,使用基类时也需要提供参数),但可能有用
另一个常见的建议是用扩展函数替换您的成员函数。看起来您想要的是“自我类型”。不幸的是,这在Kotlin中不可用。(到目前为止,一直在添加它们。)
本文讨论了一些解决方法
特别是,您可以通过参数化基类,使用该参数类型作为函数的参数类型,然后在子类中提供(或进一步限制)该类型来解决它。这有点尴尬(特别是,使用基类时也需要提供参数),但可能有用
另一个常见的建议是用扩展函数替换成员函数
class SupermarketList : BaseList() {
override fun <T : BaseItem> addItem(item: T) {
}
}
class SupermarketList : BaseList() {
override fun <T : SupermarketItem> addItem(item: T) {
}
}