我注意到我可以將一個double值轉換爲像這樣的整數。Kotlin數字文字
var array = kotlin.arrayOfNulls<Int>(10)
for(i in array.indices){
array[i] = (Math.random().toInt())
}
如果Math.random()
返回一個double值,怎麼能雙值有一個名爲toInt()的方法?數值也是對象嗎?
我注意到我可以將一個double值轉換爲像這樣的整數。Kotlin數字文字
var array = kotlin.arrayOfNulls<Int>(10)
for(i in array.indices){
array[i] = (Math.random().toInt())
}
如果Math.random()
返回一個double值,怎麼能雙值有一個名爲toInt()的方法?數值也是對象嗎?
在Java中,任何擴展爲Number
的對象都可以調用intValue
。我會假設Kotlin在那裏暴露那個API。
是的,數字類型的實例是Kotlin對象。從Kotlin docs引用:
在Kotlin中,從某種意義上說,我們可以在任何變量上調用成員函數和屬性。有些類型是內置的,因爲它們的實現是優化的,但對於用戶來說,它們看起來像普通的類。
在實踐中,不可爲空的情況下(例如Double
相對於Double?
)與JVM原語引擎蓋下表示。
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();
}