2017-03-05 103 views
1

考慮下面的例子,是否有可能爲x設置一個接受Int的setter和另一個接受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 
+0

這是一件好事,可以防止錯誤發生,調用者不會意識到該屬性必須是浮動。你不應該改變任何代碼,除了使用double而不是float。 –

回答

-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() 
    } 
} 
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被接受,但也ByteShortBigIntegerBigDecimalAtomicIntegerAtomicLongAtomicDouble,並實現Number任何其他類。