Котлинские числовые литералы

Я заметил, что я могу преобразовать двойное значение в целое число, подобное этому.

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

Если Math.random() возвращает двойное значение, как двойное значение имеет метод с именем toInt ()? Являются ли числовые значения объектами?

Да, экземплярами числовых типов являются объекты Котлина. Цитата из документов Котлина :

В Котлине все является объектом в том смысле, что мы можем вызывать функции-члены и свойства для любой переменной. Некоторые типы встроены, поскольку их реализация оптимизирована, но для пользователя они выглядят как обычные классы.

На практике экземпляры с недопустимыми значениями (например, Double в отличие от Double? ) Представлены под капотом с примитивами JVM.

В Java любой объект, который расширяет Number имеет возможность вызвать intValue . Я бы предположил, что Котлин раскрывает этот API там.

Компилятор Kotlin стремится максимально использовать примитивы. Это означает использование примитивов, если переменная не имеет значения NULL или должна быть помещена в коробку, поскольку задействованы дженерики. ( Документы )

В случае этих функций преобразования ( .toInt() , .toLong() и т. Д.) Переменные, вызываемые этими функциями, будут примитивами, а простые баги будут использоваться на них в байт-коде. Таким образом, здесь нет бокса, это все еще примитивы, но вы можете называть их «функциями» как синтаксический сахар.

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

Если примитивному значению в противном случае присваивается нулевая переменная, например, в вашем случае (назначается элементу массива, который имеет тип Int? ), Он будет помещен в valueOf вызов valueOf при назначении:

 val n: Int? = 25 Integer n = Integer.valueOf(25); 

Таким образом, ваше конкретное задание будет сочетаться с двумя приведенными выше примерами и будет выглядеть следующим образом:

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

Если вы заинтересованы в более простой замене кода примера:

Вы можете использовать IntArray (примитивный массив, int[] в Java) вместо Array<Int> (массив значений в Integer[] , Integer[] в Java). Вы также можете инициализировать его во втором параметре конструктора, используя лямбда.

 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(); }