我是Kotlin的新手。我碰到了Object Expressions section的https://kotlinlang.org
有些对象表达语法很容易理解,
创建一个匿名类的对象
window.addMouseListener(object : MouseAdapter() {
override fun mouseClicked(e: MouseEvent) { ... }
override fun mouseEntered(e: MouseEvent) { ... }
})
只是一个对象
fun foo() {
val adHoc = object {
var x: Int = 0
var y: Int = 0
}
print(adHoc.x + adHoc.y)
}
但是我无法理解 “指定了多个超类型的对象表达式” 示例,如下所示:
open class A(x: Int) {
public open val y: Int = x
}
interface B { ... }
val ab: A = object : A(1), B {
override val y = 15
}
这是怎么回事?
${ab.y}
打印15
但是语法-> ${ab.A.y}
无效。我对${ab.A.y}
的理解将显示1
:)
答案 0 :(得分:3)
此行:
val ab: A = object : A(1), B {
意味着ab
的类是从类A
继承的,并实现了接口B
。
实际上,您给出的代码示例只有在声明并实现接口后才能编译。这是可能的实现:
open class A(x: Int) {
public open val y: Int = x
}
interface B {
fun hi()
}
val ab: A = object : A(1), B {
override val y = 15
override fun hi() {
println("hi")
}
}
在这种情况下,表达式${ab.A.y}
没有多大意义,因为对象ab
没有任何字段A
。 A
只是您最终可以将其继承的继承的超类。
答案 1 :(得分:1)
它基本上通过实现接口B 创建具有类类型A 的对象ab
。
因此,假设您的类A具有某种方法foo()
,而接口B具有某种方法bar()
,则您可以在对象ab
上访问它们,因为它属于类类型{{1 }},并实施A
。
因此,这里您将变量y替换为值 15 ,这意味着您的超类变量y将被值 15 从 1 覆盖。>