2017-07-01 40 views
4

我注意到我可以將一個double值轉換爲像這樣的整數。Kotlin數字文字

var array = kotlin.arrayOfNulls<Int>(10) 

for(i in array.indices){ 
    array[i] = (Math.random().toInt()) 
} 

如果Math.random()返回一個double值,怎麼能雙值有一個名爲toInt()的方法?數值也是對象嗎?

回答

1

在Java中,任何擴展爲Number的對象都可以調用intValue。我會假設Kotlin在那裏暴露那個API。

4

是的,數字類型的實例是Kotlin對象。從Kotlin docs引用:

在Kotlin中,從某種意義上說,我們可以在任何變量上調用成員函數和屬性。有些類型是內置的,因爲它們的實現是優化的,但對於用戶來說,它們看起來像普通的類。

在實踐中,不可爲空的情況下(例如Double相對於Double?)與JVM原語引擎蓋下表示。

1

Kotlin編譯器旨在儘可能地使用原語。這意味着使用原語,除非一個變量是可以爲空的,或者必須被裝箱,因爲涉及泛型。 (Docs

在這些轉換函數(.toInt().toLong()等)的情況下,變量,這些函數被稱爲上將基元,和簡單類型轉換將它們在字節碼中使用。所以這裏沒有發生拳擊,這些仍然是原始的,但你可以把它們稱爲「函數」作爲語法糖。

Math.random().toInt() // Kotlin 

(int) Math.random(); // Generated bytecode decompiled to Java 

在情況下否則原始值被分配給爲空的變量,如你的情況(分配給其爲Int?類型的數組元素),將使用在所述分配的valueOf呼叫被裝箱:

val n: Int? = 25 

Integer n = Integer.valueOf(25); 

所以您的具體任務將是上面的兩個例子的組合,並且將翻譯是這樣的:

array[i] = Math.random().toInt() 

array[i] = Integer.valueOf((int) Math.random()); 

如果你有興趣在一個更簡單的更換您的示例代碼:

可以使用,而不是一個Array<Int>(陣列盒裝值,Integer[]在Java中)的IntArray(基本數組,int[]在Java中)。您也可以使用lambda在構造函數的第二個參數中初始化它。

var array = IntArray(10) { Math.random().toInt() } 

這大致相當於這個Java代碼:

int[] array = new int[10]; 
for (int i = 0; i < 10; i++) { 
    array[i] = (int) Math.random(); 
}