我有一個抽象類:爲什麼我沒有看到擴展類的伴侶對象組件?
和延伸類:
Vec2t
具有以下companion object:
companion object {
@JvmField val length = 2
}
但是當我鍵入Vec2.length
,那麼它是可能的被認定爲未解決的參考...
爲什麼?我錯過了什麼?
我有一個抽象類:爲什麼我沒有看到擴展類的伴侶對象組件?
和延伸類:
Vec2t
具有以下companion object:
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()
你可以訪問length
通過Vec2t.LengthKeeper.length
,當然你不能訪問它爲Vec2.LengthKeeper.length
,因爲Vec2
類沒有名爲LengthKeeper
的嵌套對象。
標記同伴對象@JvmStatic
內部變量不字節碼生成內部Vec2t
用於length
一個靜態變量,但你只能訪問從Java,在寫下面是實際可行的與您的代碼:
Vec2 v = new Vec2();
int length = Vec2.getLength();
至於在科特林解決這個,如果你真的有通過Vec2
與語法訪問基類的屬性,你可能不得不做這樣的事情:
class Vec2 : Vec2t() {
companion object {
val length get() = Vec2t.length
}
}
是的,這是有道理的,謝謝 – elect
你在說什麼? 「Vec2t」中沒有伴侶對象,「Vec2」的比較對象看起來不像上面給出的。 – glee8e
我再次檢查,我看到你的'長度'可能實際上被命名爲'SIZE'。 – glee8e
對不起,舊代碼,我只是推 – elect