Kotlin使用by关键字委托时调用super出现abstract member cannot be accessed directly报错
报错原因
- 你用到的是Kotlin的
by接口委托特性,PurchaseHistory类并没有继承任何MutableList的具体实现类,只是将MutableList接口的所有默认实现转发给by关键字后mutableListOf()生成的实例处理。 - 重写
add方法时调用的super.add指向的是MutableList接口本身的抽象方法,没有实际实现,因此触发「abstract member cannot be accessed directly」报错。 - 类外部调用
add方法时,默认走委托转发逻辑,会调用内部持有的列表实例的实现,所以不会出现异常。
修复方案
将委托的列表实例提前声明为类的私有成员,重写方法时直接调用该实例的对应方法即可,示例代码如下:
class PurchaseHistory: MutableList<PurchaseInfo> by internalList { private val internalList = mutableListOf<PurchaseInfo>() override fun add(element: PurchaseInfo): Boolean { // 自定义业务逻辑 return internalList.add(element) } }
内容的提问来源于stack exchange,提问作者Amin Guermazi
相关产品推荐
相关产品推荐

