Я заметил, что я могу преобразовать двойное значение в целое число, подобное этому.
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(); }