访问外部范围与内部类在延伸合格这个功能

问题描述 投票:4回答:1

我如何从一个内部类访问外部范围时,我为它创建的扩展功能?

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

此代码编译和它应该执行。

当我添加下面的扩展功能

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

编译失败

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

我读qualified this的文档,它简略的提到的扩展功能,但没有任何例子。

是否有可能从扩展函数访问外部范围是什么?

kotlin syntax
1个回答
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@Athis@B的范围定义,你可以不写class A或为此事class B

© www.soinside.com 2019 - 2024. All rights reserved.