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++
}
})
}