【问题标题】:Can you inherit from abstract class a method and change its generic type to a specific one?您可以从抽象类继承方法并将其泛型类型更改为特定类型吗?
【发布时间】:2019-09-02 22:44:16
【问题描述】:

我想从基类继承一个函数,并希望它的参数匹配某个类,该类会根据继承的类发生变化,例如

基类

abstract class BaseList {
    abstract fun <T : BaseItem> addItem(item: T)
}

继承的类

class SupermarketList : BaseList() {
    override fun <T : BaseItem> addItem(item: T) {
    }
}

我想将继承类中的类型BaseItem更改为基于该类的另一种类型。例如,将其更改为Supermarket item,如下所示:

class SupermarketList : BaseList() {
    override fun <T : SupermarketItem> addItem(item: T) {
    }
}

注意Supermarket 项。

我不确定泛型是这里最好的方法;它应该实现一个接口吗?有没有其他方法可以做到这一点,例如根据类为函数实现一个参数?

需要明确的是,上面的代码是有效的,但在我看来这是一种不好的做法。如果我错误地将另一个类型传递给函数,而不是我想要的类型,会发生什么情况,这也是 BaseItem 的子类型,所以它被接受了?

【问题讨论】:

    标签: generics inheritance kotlin


    【解决方案1】:

    看起来你想要的是“自我类型”。不幸的是,这在 Kotlin 中不可用。 (到目前为止;很早就有discussions 添加它们。)

    This 文章讨论了一些解决方法。

    特别是,您可以通过参数化基类、将该参数类型用作函数的参数类型,然后在子类中提供(或进一步限制)该类型来解决此问题。这有点尴尬(特别是,基类的使用也需要提供参数),但可能会起作用。

    另一个常见的建议是用扩展函数替换你的成员函数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-01-23
      • 1970-01-01
      • 1970-01-01
      • 2010-10-22
      • 1970-01-01
      • 2021-07-05
      • 2011-08-13
      • 2023-04-03
      相关资源
      最近更新 更多