首页 > 解决方案 > Kotlin 内部类无法解析外部类中声明的扩展函数

问题描述

为什么 Kotlin 中的内部类不能访问外部类中声明的扩展函数,如下所示:

class A{
    val a = "as".foo()      // LINE 1
    class B{
        val b = "as".foo()  // LINE 2
    }

    fun String.foo(){}
}

扩展LINE 1功能已解决,但LINE 2功能未解决。想知道为什么会有这样的限制?

标签: kotlinkotlin-extension

解决方案


这不是内部类,因为您没有inner在其上使用关键字。它只是一个嵌套类。如果您熟悉 Java,它就像一个static内部类。由于它不是inner,它没有对外部类的任何隐式引用,并且不能对外部类的成员进行裸调用,因为没有使用其成员的特定实例。但是,它可以在外部类的实例上调用外部类的成员,因此您可以例如执行以下操作:

class A{
    val a = "as".foo()
    class B{
        val b = A().run { "as".foo() }
    }

    fun String.foo(){}
}

即使foo是扩展函数,它也是 A 的成员,因为它是在哪里声明的。使用使类成为作用域内的接收者的作用域函数是从另一个类调用其成员扩展函数之一的一种方法。

编辑:这是您想要在类中声明扩展的一个原因的示例。

class Sample(val id: Int) {
    private val tag = "Sample#$id"
    fun String.alsoLogged(): String{
        Log.d(tag, this)
        return this
    }
}

您可以使用此扩展轻松记录您在类中使用的字符串(或者当它是runor的接收者时apply)。在类外部声明是没有意义的,因为它使用了该类的私有tag属性。


推荐阅读