如何在内部类上调用函数

时间:2018-11-20 09:51:56

标签: kotlin

以下代码已发布在Kotlin的网站上:

class A { // implicit label @A
    inner class B { // implicit label @B
        fun Int.foo() { // implicit label @foo
            val a = this@A // A's this
            val b = this@B // B's this

            val c = this // foo()'s receiver, an Int
            val c1 = this@foo // foo()'s receiver, an Int

            val funLit = lambda@ fun String.() {
                val d = this // funLit's receiver
            }


            val funLit2 = { s: String ->
                // foo()'s receiver, since enclosing lambda expression
                // doesn't have any receiver
                val d1 = this
            }
        }
    }
}

我不清楚您如何在内部类中调用函数。例如,如何调用Int.foo()

var a = A()
a.Int.foo() // This is not allowed.

2 个答案:

答案 0 :(得分:3)

让我们看一个更简单的例子:

class A { 

    inner class B { 

        fun foo() { 
          // ...
        }
    }
}

要在内部类中调用函数,必须使用外部类的实例访问它,如下所示:

A().B().foo()

使示例更加困难的是Int.foo()是扩展函数,因此要访问它,必须在与扩展函数相同的作用域内的foo()上调用Int:< / p>

class A { // outer class A
    inner class B { // inner class B
        fun Int.foo() { // entension function foo
            print("Foo called on integer $this")
        }

        fun caller(i: Int) { // calls extension function
            i.foo()
        }
    }
}

fun main() {
    A().B().caller(10)   // calls extension function in inner class B
}

在这里,我们添加了功能caller,该功能与扩展功能的作用域相同。该代码输出以下内容:

Foo called on integer 10

答案 1 :(得分:1)

在这种情况下,fooB中定义的扩展功能。默认情况下,您无法从外部调用这些member extension functions。但是,可以在进入B的范围时执行该功能,这可以通过诸如with之类的作用域功能来实现。请注意,只能在Int的实例上调用此扩展功能。

val a = A()
val b = a.B()
with(b) {
    5.foo()
}