为什么我看不到扩展 class 的伴生对象组件?
Why I don't see companion object component of extended class?
我有一个摘要class:
和扩展 class:
Vec2t
有以下 companion object:
companion object {
@JvmField val length = 2
}
但是当我键入 Vec2.length
时,它被标记为未解析的引用...
为什么?我错过了什么?
在 Kotlin 中,companion object
只是在您的 class 中特别标记的 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
class 可以没有名为 LengthKeeper
.
的嵌套对象
在伴随对象 @JvmStatic
中标记一个变量确实会在字节码的 Vec2t
中为 length
生成一个静态变量,但您只能从 Java 访问它,其中编写以下内容实际上适用于您的代码:
Vec2 v = new Vec2();
int length = Vec2.getLength();
至于在 Kotlin 中解决这个问题,如果您真的必须使用该语法通过 Vec2
访问基 class 的 属性,您可能需要做一些事情像这样:
class Vec2 : Vec2t() {
companion object {
val length get() = Vec2t.length
}
}
我有一个摘要class:
和扩展 class:
Vec2t
有以下 companion object:
companion object {
@JvmField val length = 2
}
但是当我键入 Vec2.length
时,它被标记为未解析的引用...
为什么?我错过了什么?
在 Kotlin 中,companion object
只是在您的 class 中特别标记的 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
class 可以没有名为 LengthKeeper
.
在伴随对象 @JvmStatic
中标记一个变量确实会在字节码的 Vec2t
中为 length
生成一个静态变量,但您只能从 Java 访问它,其中编写以下内容实际上适用于您的代码:
Vec2 v = new Vec2();
int length = Vec2.getLength();
至于在 Kotlin 中解决这个问题,如果您真的必须使用该语法通过 Vec2
访问基 class 的 属性,您可能需要做一些事情像这样:
class Vec2 : Vec2t() {
companion object {
val length get() = Vec2t.length
}
}