不同类型的属性设置器

时间:2017-03-05 17:38:41

标签: properties kotlin

考虑以下示例,是否可以为x设置一个接受Int的设置器和另一个接受Double的设置器?

class Test(x: Float) {

    var x: Float = x
        get() {
            return field
        }
        set(value) { // 'value' is of type 'Float'
            field = value
        }

}

原因:如果我想为x分配一个新值,我总是必须在每个作业中附加f后缀,即

var v = Test(12f)
v.x = 11   // error: 'The integer literal does not conform to the expected type Float'
v.x = 11.0 // error: 'The floating-point literal does not conform to the expected type Float'
v.x = 11f  // ok

2 个答案:

答案 0 :(得分:1)

虽然你不能重置setter,你可以利用Number接口,只需接受所有数字并将它们转换为浮点数:

class Test(x: Float) {
    var x: Number = x
        get() {
            return field
        }
        set(value) { // 'value' is of type 'Number'
            field = value.toFloat()
        }
}

这意味着不仅可以接受FloatIntDouble,还可以接受ByteShortBigInteger,{{ 1}},BigDecimalAtomicIntegerAtomicLong以及任何其他实现AtomicDouble的类。

答案 1 :(得分:-1)

怎么样:

class Test(x: Float) {
    var x: Float = x
        get() {
            return field
        }
        set(value) { // 'value' is of type 'Float'
            field = value
        }

    fun setX(value: Int) {
        x = value.toFloat()
    }
}