2017-03-04 8 views
1

私は抽象クラスを持っている:拡張クラスのコンパニオンオブジェクトコンポーネントが表示されないのはなぜですか?

abstract class Vec2t

と拡張クラス:

class Vec2 : Vec2t

Vec2tには、以下のcompanion objectがあります

companion object { 

    @JvmField val length = 2 
} 

しかし、私はVec2.lengthを入力し、それはママです未解決の参照としてrked ...

なぜですか?私は何が欠けていますか?

+0

何をお話しますか? 'Vec2t'にはコンパニオンオブジェクトはなく、' Vec2'のコンパニオンオブジェクトは、あなたが上で与えたものと同じではありません。 – glee8e

+0

もう一度チェックして、あなたの '長さ'が実際には 'SIZE'という名前になっているのを見ました。 – glee8e

+0

申し訳ありませんが、古いコード、私はちょうど押した – elect

答えて

4

コトルでは、companion objectはクラス内に特別にマークされたobjectです。名前を省略すると、既定の名前はCompanionになり、MyClass.Companion.myPropertyではなくMyClass.myPropertyの構文を使用してメンバーにアクセスできるという便利さも得られます。しかし、まだ入れ子になっているのはobjectです。

は、それが代わりにコンパニオンの定期的なネストされたオブジェクトであれば、物事がどのように機能するかを想像して:あなたは length Vec2t.LengthKeeper.lengthを経由してアクセスすることができました

abstract class Vec2t { 

    object LengthKeeper { 
     val length = 2 
    } 

} 

class Vec2 : Vec2t() 

は、もちろん、あなたはので、Vec2.LengthKeeper.lengthとしてそれにアクセスすることができませんでしたVec2クラスには、LengthKeeperというネストされたオブジェクトがありません。

バイトコードにVec2tlengthのための静的変数を生成しないコンパニオンオブジェクト@JvmStatic内部変数をマーキングしていますが、アクセスのみ可能という書き込みをあなたのコードで実際の作業ではありません次のJava、から:

Vec2 v = new Vec2(); 
int length = Vec2.getLength(); 
あなたが本当にその構文で Vec2を通じて、基本クラスのプロパティにアクセスする必要がある場合は、Kotlinでこれを解決するためのよう

、あなたはおそらくこのような何かをする必要があります:

class Vec2 : Vec2t() { 

    companion object { 
     val length get() = Vec2t.length 
    } 

} 
+0

うん、それは感謝します、ありがとう – elect

関連する問題