2017-09-11 10 views
2

LocalDateまたはStringという異なるタイプを受け入れるセッターを持つLocalDateタイプのプロパティを持つクラスを作成しようとしています。 LocalDateの場合、値は直接割り当てられ、Stringの場合は解析されて割り当てられます。 Javaでは、上記の両方のケースを処理する2つのオーバーロードされたセッターを実装するだけです。しかし、私はKotlinでそれをどう扱うべきか分かりません。私はこれを試しました:Kotlin:異なるタイプの複数のセッターを持つ単一のプロパティ

class SomeExampleClass(var _date: LocalDate) { 
    var date = _date 
     set(value) { 
      when(value) { 
       is LocalDate -> value 
       is String -> LocalDate.parse(value) 
      } 
     } 
} 

コンパイルされません。どのようにしてこのような問題を解決できますか?だから、

+0

どちらかを使って作成した後に設定できますか、どちらかで構築できますか? – jrtapsell

+0

文字列:後に設定します(これは、JSPファイルからSpringコントローラにデータが転送される場合です)。 LocalDate: – sva605

+0

の後に構築または設定するこの時点でセッターのオーバーロードはサポートされていません。この[post](https://stackoverflow.com/questions/43086327/setter-overloading-in-kotlin)またはこの[issue](https://youtrack.jetbrains.com/issue/KT-4075)を参照してください。 )。 – BakaWaii

答えて

2

を作成します。

class A(_date: LocalDate) { 
    var date: Any = _date 
     set(value) { 
      field = helperSet(value) 
     } 
     get() = field as LocalDate 

    private fun <T> helperSet(t: T) = when (t) { 
     is LocalDate -> t 
     is String -> LocalDate.parse(t) 
     else -> throw IllegalArgumentException() 
    } 
} 
+0

それは素晴らしいですが、あなたが得るすべての検証が実行時間です。 – arekolek

1

あなただけ(constructorを経由して)、それを構築したい場合は、ちょうど私が過負荷にセッターの問題に戻って、次のソリューション開発しばらくsecondary constructor

SomeExampleClass(LocalDate.MAX) 
SomeExampleClass("2007-12-03") 

class SomeExampleClass(var _date: LocalDate) { 
    constructor(_date: String) : this(LocalDate.parse(_date)) 
} 
+0

残念ながら、単純化されていないコードの場合は動作しません。http://clip2net.com/s/3NE0Vra – sva605

+0

しかし、スクリーンショットの問題はこの問題とは関係ありませんね。 – guenhter

+0

実際の問題は、文字列型の日付と時刻のデータをJSPからSpringコントローラに転送し、LocalDate/LocalTime形式のクラスに変換するDTOクラスを作成することによって解決されました。 – sva605

関連する問題