2017-03-04 42 views
1

我有一個抽象類:爲什麼我沒有看到擴展類的伴侶對象組件?

abstract class Vec2t

和延伸類:

class Vec2 : Vec2t

Vec2t具有以下companion object

companion object { 

    @JvmField val length = 2 
} 

但是當我鍵入Vec2.length,那麼它是可能的被認定爲未解決的參考...

爲什麼?我錯過了什麼?

+0

你在說什麼? 「Vec2t」中沒有伴侶對象,「Vec2」的比較對象看起來不像上面給出的。 – glee8e

+0

我再次檢查,我看到你的'長度'可能實際上被命名爲'SIZE'。 – glee8e

+0

對不起,舊代碼,我只是推 – elect

回答

4

在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 
    } 

} 
+0

是的,這是有道理的,謝謝 – elect

相關問題