为什么我看不到扩展 class 的伴生对象组件?

Why I don't see companion object component of extended class?

我有一个摘要class:

abstract class Vec2t

和扩展 class:

class Vec2 : Vec2t

Vec2t 有以下 companion object:

companion object {

    @JvmField val length = 2
}

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

为什么?我错过了什么?

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

想象一下,如果它是一个普通的嵌套对象而不是一个同伴,事情会怎样:

abstract class Vec2t {

    object LengthKeeper {
        val length = 2
    }

}

class Vec2 : Vec2t()

您可以通过 Vec2t.LengthKeeper.length 访问 length,但是您当然不能通过 Vec2.LengthKeeper.length 访问它,因为 Vec2 class 可以没有名为 LengthKeeper.

的嵌套对象

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

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

至于在 Kotlin 中解决这个问题,如果您真的必须使用该语法通过 Vec2 访问基 class 的 属性,您可能需要做一些事情像这样:

class Vec2 : Vec2t() {

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

}