2017-05-23 68 views
0

在java中,我們可以分配給intdouble,例如double x = 123;科特林 - 數字類型的自動轉換

在科特林,我們得到了一個編譯錯誤。

問題:我們能否實現自動轉換功能在kotlin?爲什麼kotlin默認沒有此功能?

var x: Double = 123; // ERROR 

再舉一個例子:

fun foo(x: Double) { } 

fun main(args: Array<String>) { 
    foo(123.0); // OK 
    foo(123); // ERROR 
} 

UPDATE:

字面123可以在編譯時被自動轉換爲ShortLong。但它不會被轉換爲FloatDouble

fun fooShort(x: Short) {} 
fun fooInt(x: Int)  {} 
fun fooLong(x: Long) {} 


fun main(args: Array<String>) { 
    fooShort(123) // OK 
    fooInt(123) // OK 
    fooLong(123) // OK 
} 
+3

科特林想知道,如果你正在做的事情有意或無意。如果它允許隱式轉換,那麼我們永遠不會知道,編譯器也無法提供幫助。隱性轉換在統計上已被證明是大量的錯誤,神祕錯誤,邪惡的錯誤。 Kotlin不允許這樣做,因爲它希望開發者表達意圖,而不是猜測它。沒有計劃改變這一點。 –

+1

在Java中,您不會將'int'賦值給'double',而是經歷一個擴展過程,然後進行賦值。您可以閱讀對可能發生的所有事情的簡單解釋:https://docs.oracle.com/javase/specs/jls/se8/html/jls-5.html –

回答

3

號這是不會發生的。作爲kotlin是強類型的意思類型沒有隱含裹挾。你需要一個明確的類型轉換。從Kotlin Explicit Conversions的參考資料中可以看出:

由於表示方式不同,較小的類型不是較大的類型的子類型。 [...] 因此,較小的類型不隱式轉換爲更大的類型。 [...] 我們可以使用顯式轉換,擴大數字。