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