object表达式

创建一个继承自某种类型的匿名类实例,我们按照如下方式书写:

window.addMouseListener(object : MouseAdapter() {
    override fun mouseClicked(e: MouseEvent) {
        // ...
    }

    override fun mouseEntered(e: MouseEvent) {
        // ...
    }
})

如果超类有一个构造方法,适当的构造器参数需要传递给构造器。多个超类需要使用都好分隔,并紧跟在冒号后面。

open class A(x: Int) {
    public open val y: Int = x
}
interface B {...}
val ab: A = object : A(1), B {
    override val y = 15
}

如果万一我们只是需要一个对象,i并且没有什么重要的超类,我们可以简单的按照下面的方式书写:

fun foo() {
    val adHoc = object {
        var x: Int = 0
        var y: Int = 0
    }
    print(adHoc.x + adHoc.y)
}

需要注意的是匿名对象仅仅是可以被用作局部和private声明。如果你将匿名对象作为公有函数返回类型或公共属性,那么实际类型将会是你声明的超类类型或者如果你没有声明超类,那么实际类型将会是Any。添加到匿名object对象的成员将不能被访问。

class C {
    // Private function, so the return type is the anonymous object type
    private fun foo() = object {
        val x: String = "x"
    }

    // Public function, so the return type is Any
    fun publicFoo() = object {
        val x: String = "x"
    }

    fun bar() {
        val x1 = foo().x // Works
        val x2 = publicFoo().x // ERROR: Unresolved reference 'x'
    }
}

就像Java的匿名内部类,object表达式中的代码可以访问作用于内的变量。(与Java不同的是,这不仅仅是限制于final变量)

fun countClicks(window: JComponent) {
    var clickCount = 0
    var enterCount = 0

    window.addMouseListener(object : MouseAdapter() {
        override fun mouseClicked(e: MouseEvent) {
            clickCount++
    }

        override fun mouseEntered(e: MouseEvent) {
            enterCount++
        }
    })
}

results matching ""

    No results matching ""