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

ele*_*ect 3 kotlin companion-object

我有一个抽象类:

abstract class Vec2t

和扩展类:

class Vec2 : Vec2t

Vec2t有以下配套对象:

companion object {

    @JvmField val length = 2
}
Run Code Online (Sandbox Code Playgroud)

但是当我输入时Vec2.length,它被标记为未解决的参考...

为什么?我错过了什么?

zsm*_*b13 6

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

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

abstract class Vec2t {

    object LengthKeeper {
        val length = 2
    }

}

class Vec2 : Vec2t()
Run Code Online (Sandbox Code Playgroud)

您可以访问lengthvia Vec2t.LengthKeeper.length,但当然您无法访问它Vec2.LengthKeeper.length,因为Vec2该类没有调用嵌套对象LengthKeeper.

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

Vec2 v = new Vec2();
int length = Vec2.getLength();
Run Code Online (Sandbox Code Playgroud)

至于在Kotlin中解决这个问题,如果你真的必须通过Vec2这种语法访问基类的属性,你可能必须做这样的事情:

class Vec2 : Vec2t() {

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

}
Run Code Online (Sandbox Code Playgroud)