我有一个抽象类:
和扩展类:
Vec2t
包含以下companion object:
companion object {
@JvmField val length = 2
}
但是当我输入Vec2.length
时,它被标记为未解析的引用...
为什么呢?我错过了什么?
答案 0 :(得分:6)
在Kotlin中,companion object
只是您班级中特别标记的object
。您可以省略其名称,它将获得默认名称Companion
,您还可以方便地使用MyClass.myProperty
语法而不是MyClass.Companion.myProperty
来访问其成员。但是,它仍然只是嵌套的object
。
想象一下,如果它是一个常规的嵌套对象而不是一个伴侣,它会如何工作:
abstract class Vec2t {
object LengthKeeper {
val length = 2
}
}
class Vec2 : Vec2t()
您可以通过length
访问Vec2t.LengthKeeper.length
,但当然您无法以Vec2.LengthKeeper.length
的身份访问它,因为Vec2
类没有嵌套名为LengthKeeper
的对象。
在伴随对象@JvmStatic
内标记变量会在字节码中为length
内的Vec2t
生成一个静态变量,但是您只能从Java访问该变量,其中编写以下内容实际上可以使用你的代码:
Vec2 v = new Vec2();
int length = Vec2.getLength();
至于在Kotlin中解决这个问题,如果您真的必须通过Vec2
使用该语法访问基类的属性,那么您可能需要执行以下操作:
class Vec2 : Vec2t() {
companion object {
val length get() = Vec2t.length
}
}