Kotlin:单一财产与多个不同类型的制定者

我试图建立一个具有LocalDate类型属性的类,它具有接受不同类型的setter: LocalDateString 。 在LocalDate情况下,值被直接分配,在String情况下,它被解析并分配。 在Java中,我只需要实现两个处理上述情况的重载setter。 但我不知道如何处理在Kotlin。 我试过这个:

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

它不编译。 我该如何解决这个问题?

所以如果你只是想构造它(通过constructor ),只需创建一个辅助构造函数

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

它不会编译,因为你的setter的参数必须是Any才能传递不同的类型( StringLocalDate )。 这是不允许的:

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

所以你不能在你的场景中使用这样的setter。 可以像在java中那样用重载setter来实现它,或者你提供接受StringLocalDate构造函数

  1. 过载设置器

     class SomeExampleClass(var _date: LocalDate) { fun setDate(d: LocalDate) { _date = d } fun setDate(d: String) { setDate(LocalDate.parse(d)) } } 
  2. 提供构造函数

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

第二个例子可以简化为什么guenhter建议。

过了一段时间,我回到了重载setter的问题,并开发了以下解决方案:

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