3

我有一个抽象类:

abstract class Vec2t

和一个扩展类:

class Vec2 : Vec2t

Vec2t具有以下伴随对象

companion object {

    @JvmField val length = 2
}

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

为什么?我错过了什么?

4

1 回答 1

6

在 Kotlin 中,acompanion object只是object在你的类中特别标记的。你可以省略它的名字,它会得到默认的名字Companion,你还可以方便地使用MyClass.myProperty语法而不是MyClass.Companion.myProperty访问它的成员。然而,它仍然只是一个嵌套的object.

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

abstract class Vec2t {

    object LengthKeeper {
        val length = 2
    }

}

class Vec2 : Vec2t()

您可以访问lengthvia Vec2t.LengthKeeper.length,但当然不能访问它 as Vec2.LengthKeeper.length,因为Vec2该类没有名为 的嵌套对象LengthKeeper

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

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

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

class Vec2 : Vec2t() {

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

}
于 2017-03-04T11:03:43.407 回答