2017-07-01 44 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(); 
}