2017-07-31 16 views
2

私はJavaクラスからタグにアクセスしようとすると、私はどちらかJavaは、Kotlinの基本変数にアクセスできますが、Kotlinではできません。なぜですか?

public class JavaOther { 
    String test1 = KotlinBase.TAG; // This is okay 
    String test2 = KotlinChild.TAG; // This is okay 
} 

しかし可能性

class KotlinChild : KotlinBase() 

として

open class KotlinBase { 
    companion object { 
     const val TAG = "testing" 
    } 
} 

そして、それの子以下のように私はクラスを持っていますKotlinクラスからアクセスすると、私は子供を通してアクセスすることはできません。

class KotlinOther { 
    val test1 = KotlinChild.TAG // Compile/Syntax error 
    val test2 = KotlinBase.TAG // This is okay 
} 

はなぜKotlinクラスのアクセスはKotlinChildを通じてTAG変数継承することはできませんか?

答えて

5

これはあいまいさを避けるための設計上の決定です。 - 子クラスは、フィールド/メソッドが親クラスと同じ名前を持つ独自のcompanion objectを持つことができます。

実際のクラスでのみコンパニオンへのアクセスを制限することで、あいまいなフィールド/メソッドシャドウイングの問題はもう存在しません。

また、コンパニオンオブジェクトは他の言語で知られているstaticのメンバーではありません。ただし、ユースケースの大部分は重複しています。

また、

KotlinBase.TAG 

がためのショートカットであることを覚えておいてください:

KotlinBase.Companion.TAG 
関連する問題