Kotlin:使用委托时“抽象成员不能直接访问”(“by”关键字)

lmvvr0a8  于 2023-05-18  发布在  Kotlin
关注(0)|答案(2)|浏览(361)

下面是示例代码:

class PurchaseHistory: MutableList<PurchaseInfo> by mutableListOf() {
    override fun add(element: PurchaseInfo): Boolean {
        // ... some code
        return super.add(element)
    }
}

但是,我得到了abstract member cannot be accessed directly。当我在类外使用原始方法时,我不会遇到任何问题,但为什么我不能在类内做同样的事情呢?

rta7y2nd

rta7y2nd1#

你得到这个错误是因为你试图调用的add方法并不真正在PurchaseHistory的超类中(因为它没有超类),因此这个错误告诉你你不能仅仅使用super调用接口(抽象)方法。
要执行您想要的操作,您可以保留一个指定对象的句柄。例如,您可以将其存储为属性:

class PurchaseHistory(
    private val backingList: MutableList<PurchaseInfo> = mutableListOf()
): MutableList<PurchaseInfo> by backingList {
    override fun add(element: PurchaseInfo): Boolean {
        // ... some code
        return backingList.add(element)
    }
}

另一种选择是直接扩展MutableList的实现(例如ArrayList),而不是通过委托实现,但这可能不是您的选择。

okxuctiv

okxuctiv2#

您正在尝试从未定义的接口MutableList调用方法。
只要把你的类做成ArrayList supper,你应该会有很好的结果:

class PurchaseHistory: ArrayList<PurchaseInfo>() {

    override fun add(element: Int): Boolean {
        // ... some code
        return super.add(element)
    }
}

相关问题