Под упаковкой и распаковкой понимается перенос примитивного значения в класс, чтобы его можно было использовать с обобщенными c классами и функциями или в качестве обнуляемого значения. В Java это более прозрачно, потому что примитивные и коробочные версии каждого типа переменных имеют разные имена (т.е. int
и Integer
), тогда как в Kotlin это не очень очевидно. Если ваша переменная имеет значение NULL, например Int?
, она всегда в штучной упаковке, но если она не имеет значения NULL, она упаковывается только в том случае, если она передана в функцию, которая является обобщенной c или запрашивает версию NULL. Таким образом, бокс как глагол относится к переменной, обернутой в класс в момент, когда она передается чему-то, что требует коробочную версию.
Существует интерфейс для обобщенного c диапазон называется ClosedRange
. Когда вы работаете с целочисленными диапазонами, вы используете класс с именем IntRange
, который также реализует ClosedRange<Int>
.
Когда вы используете свойства универсального c интерфейса, например start
, JVM должна установить и распаковать ваше значение Int
. Это связано с тем, что дженерики не могут быть использованы с неупакованными примитивами. Существует небольшое количество накладных расходов времени выполнения для распаковки и распаковки примитива.
Фактический класс IntRange
хранит значения для начала и конца диапазона в виде примитивов, поэтому, если вы обращаетесь к ним напрямую с помощью first
, вы обходите бокс, который происходит, если вы go через свойство интерфейса generi c, для небольшого прироста производительности.
В подавляющем большинстве случаев разница в производительности будет незначительной в любом случае, но проверка кода по умолчанию рекомендует использовать более эффективный способ.