在内部类的扩展函数中使用限定的条件访问外部范围

时间:2019-02-05 23:09:01

标签: kotlin syntax

为内部类创建扩展函数时,如何从内部类访问外部范围?

示例

class A {
    inner class B {
        fun own() = this@A
    }
}

此代码按照预期的方式编译和执行。

当我添加以下扩展功能时

fun A.B.ext() = this@A

编译失败,显示

Error:(7, 22) Kotlin: Unresolved reference: @A

我阅读了qualified this的文档,其中简要提到了扩展功能,但没有任何示例。

是否可以从扩展功能访问外部作用域?

1 个答案:

答案 0 :(得分:1)

扩展功能只能执行非扩展fun ext(x: A.B)可以执行的操作,因此我希望不会像you can't access it in Java那样执行。这是因为它编译为这样的函数,其语法只是使其看起来像一个成员。

虽然类B的字段包含对外部A实例的引用,但是不能直接从代码中按名称访问此字段。允许访问它的violate encapsulation

链接的页面讨论“从外部范围访问this”。这里的“作用域”在https://en.wikipedia.org/wiki/Scope_(computer_science)的意义上使用,因此在示例中,您的作用域具有注释为“隐式标签”的

class A { // outer scope 1
    inner class B { // outer scope 2
        fun Int.foo() { // function scope
        }
    }
}

同时

fun A.B.ext() = ...

没有任何外部范围(文件范围除外,该范围没有this)。除非是真的

class C {
    fun A.B.ext() = // can use this@C
}

但是您不能编写this@A或为此this@B,因为该函数未在class Aclass B的范围内定义。