对象表达式,多个超类型规范语法?

时间:2019-05-08 06:40:38

标签: kotlin

我是Kotlin的新手。我碰到了Object Expressions sectionhttps://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:)

2 个答案:

答案 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没有任何字段AA只是您最终可以将其继承的继承的超类。

答案 1 :(得分:1)

它基本上通过实现接口B 创建具有类类型A 的对象ab

因此,假设您的类A具有某种方法foo(),而接口B具有某种方法bar(),则您可以在对象ab上访问它们,因为它属于类类型{{1 }},并实施A

因此,这里您将变量y替换为值 15 ,这意味着您的超类变量y将被值 15 1 覆盖。