Kotlin接口中定义的扩展函数可见性问题求助
解决接口内定义的扩展函数无法访问的问题
问题原因分析
你在SquareBoard接口内定义的getNeighbour是接口的成员扩展函数,这类扩展函数并非全局可用,必须依赖SquareBoard的实例才能调用。另外注意编译错误提示的是getNeighbor(美式拼写),而你定义的是getNeighbour(英式拼写),这也可能是直接触发错误的原因之一。
具体解决方案
方案1:让GameImpl实现SquareBoard接口
如果GameImpl本身是SquareBoard的实现类,直接实现接口后,就可以在processMove中直接调用扩展函数:class GameImpl : SquareBoard { fun processMove(cell: Cell) { val neighbor = cell.getNeighbour() // 当前实例是SquareBoard实现,可直接调用 } // 实现SquareBoard的其他抽象方法 }方案2:持有SquareBoard实例并通过实例调用
如果GameImpl不需要实现SquareBoard,只需在类中持有一个SquareBoard的实例,通过该实例的上下文调用成员扩展函数:class GameImpl(private val board: SquareBoard) { fun processMove(cell: Cell) { // 方式1:通过board的上下文调用 val neighbor = board.run { cell.getNeighbour() } // 方式2:显式以接口实例为接收者调用(语法糖形式) val neighbor2 = board.getNeighbour(cell) } }方案3:统一函数名拼写
确认调用时的函数名和定义完全一致:如果定义的是getNeighbour,调用时不要写成getNeighbor,反之亦然。拼写差异是这类编译错误的常见诱因。
内容的提问来源于stack exchange,提问作者pbuchheit
相关产品推荐
相关产品推荐

