Давайте проверим этот код котлина:
fun main(args: Array<String>) {
val list = ArrayList<Int>()
list.add(0)
list[0] = 10
}
Давайте декомпилируем его в класс Java:
public final class AllocationKt {
public static final void main(@NotNull String[] args) {
Intrinsics.checkParameterIsNotNull(args, "args");
ArrayList list = new ArrayList();
list.add(0);
list.set(0, 10);
}
}
Это декомпилированный код.Не похоже, что новый объект был создан ( на данный момент ).
А теперь давайте проверим код Java - исходный код и декомпилированный:
public class Allocation {
public static void main(String[] args) {
ArrayList<Integer> arrayList = new ArrayList<>();
arrayList.add(0);
arrayList.set(0, 10);
}
}
И декомпилированный:
public class Allocation {
public Allocation() {
}
public static void main(String[] args) {
ArrayList<Integer> arrayList = new ArrayList();
arrayList.add(0);
arrayList.set(0, 10);
}
}
(Почти то же самое).
Заключение : При присваивании Int для ArrayList<Int>
в Kotlin не генерируется new Integer(i)
в коде Java.Я также проверил на двойную - примитив используется в скомпилированном коде.
Обновление 1: Как я понял позже, я только доказал, что сгенерированный код kotlin не отличается от кода Java.Но я забыл об одной очень важной вещи. Аргументы общего типа должны быть ссылочными типами .Итак, что происходит, когда я пытаюсь поместить примитив int
в список Integer
?
Автобокс - это ответ.
Автобокс - это автоматическое преобразование, которое Java-компилятор выполняет между примитивными типами и соответствующими им классами обертки объектов.
Таким образом, в байт-коде ваш примитив int
станетInteger
, ваш примитив bool
станет Boolean
и т. д. - когда это необходимо.