Kotlin: propiedad individual con varios setters de diferentes types

Estoy tratando de build una class que tenga una propiedad de tipo LocalDate que tenga LocalDate que acepten diferentes types: LocalDate o String . En el caso de LocalDate , el valor se asigna directamente, en el caso de String , se analiza y luego se asigna. En Java, solo necesito implementar dos setters sobrecargados que manejen ambos casos mencionados anteriormente. Pero no tengo idea de cómo manejar eso en Kotlin. He intentado esto:

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

No comstack ¿Cómo puedo resolver ese problema?

Entonces, si solo quieres buildlo (a través del constructor ), simplemente crea un constructor secundario

 SomeExampleClass(LocalDate.MAX) SomeExampleClass("2007-12-03") class SomeExampleClass(var _date: LocalDate) { constructor(_date: String) : this(LocalDate.parse(_date)) } 

Después de un time volví al problema de los setters sobrecargados y desarrollé la siguiente solución:

 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() } } 

No comstack porque el parámetro de su setter debería ser Any para poder pasar diferentes types ( String y LocalDate ). Esto no esta permitido:

 var date = _date //Error: Setter parameter type must be equal to the type of the property, ie 'LocalDate' set(value: Any){...} 

Entonces no puedes usar ese setter en tu escenario. Implementarlo con setters sobrecargados como en java o proporcionar constructores que acepten String o LocalDate

  1. Setters de sobrecarga

     class SomeExampleClass(var _date: LocalDate) { fun setDate(d: LocalDate) { _date = d } fun setDate(d: String) { setDate(LocalDate.parse(d)) } } 
  2. Proporcionar constructores

     class SomeExampleClass { lateinit var _date: LocalDate constructor(date: LocalDate){ _date = date } constructor(date: String) : this(LocalDate.parse(date)) } 

El segundo ejemplo se puede simplificar a lo que Guenhter sugirió.

  • Lanzamiento inteligente a kotlin.String
  • ¿Puedo usar @Bean de AndroidAnnotation dentro de Kotlin?
  • Android: el código funciona con api 19 pero no con api 24
  • Cómo pasar la class Java a la class de datos de Kotlin
  • Reemplazar textView para NumberPicker - Android
  • No se puede acceder a BaseColumns proporciona la propiedad _ID en Kotlin
  • Error de installation de Gradle: Javadoc
  • Instancia de Kotlin KClass dentro de la function de extensión
  • Android Kotlin: burlarse de una function gratuita usando Mockito / PowerMock
  • ¿Objeto de database Singleton con initialization parametrizada al inicio?
  • La exception lanzada al comprimir bitmap dentro de AsyncTask no detiene la ejecución