Kotlin数字文字

我注意到我可以将一个double值转换成这样的整数。

var array = kotlin.arrayOfNulls<Int>(10) for( i in array.indices ){ array[i] = ( Math.random().toInt() ) } 

如果Math.random()返回一个double值,那么double值如何有一个名为toInt()的方法? 数值也是对象吗?

是的,数字类型的实例是Kotlin对象。 从Kotlin文档引用:

在Kotlin中,所有东西都是一个对象,我们可以在任何变量上调用成员函数和属性。 有些类型是内置的,因为它们的实现是优化的,但对于用户来说,它们看起来像普通的类。

在实践中,不可空的实例(例如Double ,而不是Double? )在JVM基元的引擎下表示。

在Java中,扩展Number任何对象都可以调用intValue 。 我会假设Kotlin在那里暴露那个API。

Kotlin编译器旨在尽可能地使用原语。 这意味着使用原语,除非一个变量是可以为空的,或者必须被装箱,因为涉及泛型。 ( 文档 )

在这些转换函数( .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()); 

如果您有兴趣更简单地替换您的示例代码:

您可以在Java中使用IntArray (基本数组, int[] )而不是Array<Int> (装箱值数组,Java中的Integer[] )。 你也可以使用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(); }