В Kotlin какая разница между стартом и первым? - PullRequest
3 голосов
/ 08 апреля 2020

Я учусь Kotlin, но я не могу найти прямые ответы на простые вопросы. Я предполагаю, что это так ново, что никто еще не имел возможности задать очевидные вопросы. Итак, вот и все.

Когда я хочу получить наименьший предмет из диапазона, я набираю:

range.start

Но я получаю предупреждение: «Может быть заменено на без коробки first ». Не уверен, что означает без коробки - даже не могу догадаться. Но когда я использую эту команду:

range.first

, предупреждение исчезает. Что тут происходит? Должен ли я быть обеспокоен? Почему Kotlin имеет как начало , так и первое ?

1 Ответ

8 голосов
/ 08 апреля 2020

Под упаковкой и распаковкой понимается перенос примитивного значения в класс, чтобы его можно было использовать с обобщенными c классами и функциями или в качестве обнуляемого значения. В Java это более прозрачно, потому что примитивные и коробочные версии каждого типа переменных имеют разные имена (т.е. int и Integer), тогда как в Kotlin это не очень очевидно. Если ваша переменная имеет значение NULL, например Int?, она всегда в штучной упаковке, но если она не имеет значения NULL, она упаковывается только в том случае, если она передана в функцию, которая является обобщенной c или запрашивает версию NULL. Таким образом, бокс как глагол относится к переменной, обернутой в класс в момент, когда она передается чему-то, что требует коробочную версию.

Существует интерфейс для обобщенного c диапазон называется ClosedRange. Когда вы работаете с целочисленными диапазонами, вы используете класс с именем IntRange, который также реализует ClosedRange<Int>.

Когда вы используете свойства универсального c интерфейса, например start, JVM должна установить и распаковать ваше значение Int. Это связано с тем, что дженерики не могут быть использованы с неупакованными примитивами. Существует небольшое количество накладных расходов времени выполнения для распаковки и распаковки примитива.

Фактический класс IntRange хранит значения для начала и конца диапазона в виде примитивов, поэтому, если вы обращаетесь к ним напрямую с помощью first, вы обходите бокс, который происходит, если вы go через свойство интерфейса generi c, для небольшого прироста производительности.

В подавляющем большинстве случаев разница в производительности будет незначительной в любом случае, но проверка кода по умолчанию рекомендует использовать более эффективный способ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...