我注意到我可以将一个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();
}