2016-11-03 16 views
0

私は実際にそれが問題だとはっきりとは分かりません。しかし、これはJavaのだったら、私はマップを返すようにbounds機能を望む私は、デリゲートとしてlazyを使用しようとしていますし、私はコンパイルエラーにKotlinクラスプロパティの遅延初期化はコンパイルされません

data class Geocode(var latitude: Double, var longitude: Double) : Comparable<Geocode> { 


    override fun compareTo(other: Geocode): Int { 
     var result = this.latitude.compareTo(other.latitude) 
     if (result == 0) 
      result = this.longitude.compareTo(other.longitude) 
     return result 
    } 
} 

data class HubKt(val position:Geocode) { 
} 

data class Example(val hubs:Collection<HubKt>) { 

    val bounds:Any by lazy { 
     object { 
      val ne: this.hubs.map { h -> h.position }.max() 
      val sw: this.hubs.map { h -> h.position }.min() 
     } 

    } 
} 

を取得しています:

public Map<String,Geocode> getBounds() { 
     Geocode ne = geos.stream().max(Geocode::compareTo).get(); 
     Geocode sw = geos.stream().min(Geocode::compareTo).get(); 
     return ImmutableMap.of("ne",ne,"sw",sw); 
} 

私はこの問題を考えます正しいthisを使用していません。私は[email protected]を試しました。地獄、私はそれを過度に複雑にするかもしれない。洞察に感謝します。問題の現在のコードに基づいて

+0

コンパイルエラーを表示する必要があります。そして、怠け者の中から "戻る"を取り除くと、あなたはラムダのときに戻りません。 –

+0

また、依存性の少ないサンプルを作成できますか? –

+0

すぐに更新されます –

答えて

3

data class Bounds(val ne: Geocode, val sw: Geocode) 

data class Example(val hubs:Collection<HubKt>) { 
    val bounds: Bounds by lazy { 
     Bounds(hubs.map { it.position }.max()!!, 
       hubs.map { it.position }.min()!!) 
    } 
} 

は、そうでない場合はあなたの答えにあなたがオブジェクト式を経て作成Anyのあなたの匿名の子孫でneswにアクセスすることができません。 。 BoundsクラスまたはMapなどの型付き応答が必要です(これは不快になります)。また、あなたのバージョンではnullになる可能性があります。少なくとも1つの値がリストにあることがわかっている場合は、!!を使用してmaxまたはminの結果がnullでないことを確認することができます。

あなたはこの変更にマップすることによって作成されたコピーせずにこれを行うことができます。

data class Example(val hubs:Collection<HubKt>) { 
    val bounds: Bounds by lazy { 
     Bounds(hubs.maxBy { it.position }!!.position, 
       hubs.minBy { it.position }!!.position) 
    } 
}  

または可能な範囲ではなく!!.?.安全な演算子を使用してできるようにするBoundsクラスを変更すると、あなたはnullをしたい場合null:それはオプションであり、ため

data class Bounds(val ne: Geocode?, val sw: Geocode?) 

data class Example(val hubs:Collection<HubKt>) { 
    val bounds by lazy { 
     Bounds(hubs.maxBy { it.position }?.position, 
       hubs.minBy { it.position }?.position) 
    } 
} 

私はval bounds: Boundsからタイプを落とし、最後の例でお知らせ型推論はちょうどフィンそれを把握しますe。 "未知のシンボル" として2倍

構文エラー:

-1

[OK]を、私はこの問題を解決しましたか?私は=なく:必要

val bounds:Any by lazy { 
     object { 
      val ne = hubs.map { h -> h.position }.max() 
      val sw = hubs.map { h -> h.position }.min() 
     } 

    } 

ロンボク(DOHを!):Hubpositionは、それがゲッターロンボクによって生成されていますしています

@Getter 
@Setter 
private Geocode position = new Geocode(50.0,50.0); 

変更するには:

@Setter 
private Geocode position = new Geocode(50.0,50.0); 

public Geocode getPosition() { 
    return position; 
} 

は最終的にこれがいました統合の問題。 sigh

+0

この回答はコンパイラエラーのいくつかを解決しますが、解決策は機能しません。型がアクセスできない匿名オブジェクト式から作成された 'Any'であるため、' ne'と 'sw'は誰もアクセスできません。 –

+0

質問に追加されるはずの新しい情報がこの回答に追加されました。 –

+0

ロンボクの問題は、Kotlin注釈プロセッサ(KAPT)が使用中であることを確認することによって解決される可能性があります。そのため、KotlinコンパイラがJava処理の前にKotlinを最初に実行してから、だからこそあなたの答えはうまくいくが、そこで実行されるJavaや注釈プロセッサとの統合を処理する正しい方法ではない。 –

関連する問題