2017-11-08 13 views
0

私は二次構造を持つオブジェクトmyDayForecastを作成しますが、主構造に渡す二次構造のparmaterはHashMap()なのでvar bbは空であると思います。 HashMap()についてのドキュメントを参照してください。空の状態に戻ります。myDayForecast.mapが空でないのはなぜですか?

私はコードを実行した後、var bbが空でないことがわかります(画像が表示されます)。なぜですか?

var myDayForecast= DayForecast(15L,"Desciption",10,5,"http://www.a.com",10L) 
var bb=myDayForecast.map 

class DayForecast(var map: MutableMap<String, Any?>) { 
    var _id: Long by map 
    var date: Long by map 
    var description: String by map 
    var high: Int by map 
    var low: Int by map 
    var iconUrl: String by map 
    var cityId: Long by map 

    constructor(date: Long, description: String, high: Int, low: Int, iconUrl: String, cityId: Long) 
      : this(HashMap()) { 
     this.date = date 
     this.description = description 
     this.high = high 
     this.low = low 
     this.iconUrl = iconUrl 
     this.cityId = cityId 
    } 
} 

あなたはそれでmap to store your property dataを使用している結果画像

enter image description here

+0

なぜこれをJavaとタグ付けしましたか? – Stultuske

+1

あなたが読んでいる本がまだ最後の質問のほとんどに回答していない場合は、Kotlinの紹介としては機能しません。もう1つ読む必要があります。私は前のセクションをもっと慎重に読んだら、それがそれを説明していることがわかります。 –

答えて

2

二コンストラクタ定義ライン場合:

DayForecast(var map: MutableMap<String, Any?>) 

が、引数として空のHashMapを有する:

constructor(date: Long, description: String, high: Int, low: Int, iconUrl: String, cityId: Long) 
      : this(HashMap()) { 

: this(HashMap())プライマリコンストラクタへの呼び出しです。上述のように、プライマリコンストラクタは、空のHashMapと呼ばれているということである起こる最初のものの

var myDayForecast=DayForecast(15L,"Desciption",10,5,"http://www.a.com",10L) 

1:

は、だから、電話をかけるとき。あなたはこのような主なコンストラクタを呼び出したかのよう

これは、次のとおりです。

DayForcast(マップ= HashMapの())

だから今、マップが空のHashMapに設定されています。二次コンストラクタにおいて

は、フィールドの各々はmapがDayForecastのMutableMap特性であるbymap、でマークされています。ここに見られるように:

class DayForecast(var map: MutableMap<String, Any?>) { 
    var _id: Long by map 
    var date: Long by map 
    var description: String by map 
    var high: Int by map 
    var low: Int by map 
    var iconUrl: String by map 
    var cityId: Long by map 
    ... 
} 

これは、これらのフィールドへのアクセスは、この場合MutableMap目的であるmapによって参照されるオブジェクトに委譲されることを意味します。 MutableMapオブジェクトの場合、これはblah = this.dateのようなものに翻訳されるように、コンパイラは後に、このthis.map.put(「日付」、15L)および参照のようなものにblah = this.map.get("date")

次のようthis.date = 15Lをコールを変換することを意味しますプライマリコンストラクタが呼び出され、セカンダリコンストラクタの2番目の部分が実行されます。これらのプロパティのそれぞれがvar propXYZ by map として宣言されているので、時間によってあなたは

を呼び出すように、今、これらの呼び出しのそれぞれは、値を持つ最初は空のHashMapに記入します this.map.put("date", date)などの呼び出しに翻訳され

this.date = date 
    this.description = description 
    this.high = high 
    this.low = low 
    this.iconUrl = iconUrl 
    this.cityId = cityId 

var bb=myDayForecast.map、マップはHashMapで埋められるようになりました。

これはまだ混乱している場合は、Kotlinのドキュメントのdelegate-propertiesセクションをご覧ください。

+0

ありがとう!私が理解できないのは、 "this.date = date"が "this.map.date = date" – HelloCW

+0

と等しい理由は、データへの "var date:Long by map"要求がマップオブジェクトに転送されるためです。デリゲートプロパティのリンクを参照してください。詳細は上記の – nPn

+0

を参照してください。具体的には、「マップによる」キー部分です。つまり、マッププロパティで参照されるオブジェクトを介して日付にアクセスします。 – nPn

3

。これはby mapで行い、取得して設定します。プロパティに値を割り当てることで、要素をマップに追加します。したがって、最初はHashMapは空ですが、コンストラクタの最後には暗黙的に値が追加されています。 Kotlinは、値を格納する別のフィールドまたはメカニズムを作成しません。終了時には

関連する問題