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

我有一个抽象类:

abstract class Vec2t

和扩展类:

class Vec2 : Vec2t

Vec2t有以下伴侣对象 :

 companion object { @JvmField val length = 2 } 

但是,当我输入Vec2.length ,那么它被标记为未解析的参考…

为什么? 我错过了什么?

在Kotlin中, companion object只是你的类中特别标记的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类没有一个叫做LengthKeeper的嵌套对象。

在伴随对象中标记一个变量@JvmStatic确实Vec2t在字节码中为Vec2t中的length生成一个静态变量,但是只能从Java访问它,在这种情况下编写以下代码实际上可以处理您的代码:

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

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

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