Kotlin:单一财产与多个不同类型的制定者
我试图建立一个具有LocalDate
类型属性的类,它具有接受不同类型的setter: LocalDate
或String
。 在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
才能传递不同的类型( String
和LocalDate
)。 这是不允许的:
var date = _date //Error: Setter parameter type must be equal to the type of the property, ie 'LocalDate' set(value: Any){...}
所以你不能在你的场景中使用这样的setter。 可以像在java中那样用重载setter来实现它,或者你提供接受String
或LocalDate
构造函数
-
过载设置器
class SomeExampleClass(var _date: LocalDate) { fun setDate(d: LocalDate) { _date = d } fun setDate(d: String) { setDate(LocalDate.parse(d)) } }
-
提供构造函数
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() } }