为什么我没有看到扩展类的伴侣对象组件?
我有一个抽象类:
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 } }