为什么我没有看到扩展类的伴随对象组件?

时间:2017-03-04 09:40:23

标签: kotlin companion-object

我有一个抽象类:

abstract class Vec2t

和扩展类:

class Vec2 : Vec2t

Vec2t包含以下companion object

companion object {

    @JvmField val length = 2
}

但是当我输入Vec2.length时,它被标记为未解析的引用...

为什么呢?我错过了什么?

1 个答案:

答案 0 :(得分:6)

在Kotlin中,companion object只是您班级中特别标记的object。您可以省略其名称,它将获得默认名称Companion,您还可以方便地使用MyClass.myProperty语法而不是MyClass.Companion.myProperty来访问其成员。但是,它仍然只是嵌套的object

想象一下,如果它是一个常规的嵌套对象而不是一个伴侣,它会如何工作:

abstract class Vec2t {

    object LengthKeeper {
        val length = 2
    }

}

class Vec2 : Vec2t()

您可以通过length访问Vec2t.LengthKeeper.length,但当然您无法以Vec2.LengthKeeper.length的身份访问它,因为Vec2类没有嵌套名为LengthKeeper的对象。

在伴随对象@JvmStatic内标记变量会在字节码中为length内的Vec2t生成一个静态变量,但是您只能从Java访问该变量,其中编写以下内容实际上可以使用你的代码:

Vec2 v = new Vec2();
int length = Vec2.getLength();

至于在Kotlin中解决这个问题,如果您真的必须通过Vec2使用该语法访问基类的属性,那么您可能需要执行以下操作:

class Vec2 : Vec2t() {

    companion object {
        val length get() = Vec2t.length
    }

}
相关问题