Почему бы не использовать автоматическую коробку типов примитивов Java для Generics? - PullRequest
5 голосов
/ 12 августа 2011

Java не позволяет использовать примитивные типы в общих структурах данных. Например. ArrayList не допускается. Причина в том, что примитивные типы не могут быть непосредственно преобразованы в Object. Однако Java 1.5 поддерживает автобокс и классы-оболочки работают в общих структурах данных. Так почему же компилятор не может автоматически установить его в ArrayList ? Есть ли другие причины, по которым это не может работать?

Ответы [ 6 ]

6 голосов
/ 12 августа 2011

Итак, насколько я понимаю, ваш предложенный ArrayList<int> будет идентичен ArrayList<Integer>. Это правильно? (Другими словами, внутренне он все еще хранит целое число; и каждый раз, когда вы помещаете что-либо или извлекаете его, оно автоматически упаковывает / распаковывает его, но автобокс / автоустановка уже делает это для ArrayList<Integer>.)

Если это то же самое, то я не понимаю, какая польза от наличия дублирующего синтаксиса <int>, что означает то же самое, что и <Integer>. (На самом деле это создаст дополнительные проблемы, потому что, например, int[] не тот же тип времени выполнения, что и Integer[], поэтому, если у вас есть T[], а T - это int, что бы это значило?)

1 голос
/ 12 августа 2011

Проблема будет в производительности.Для каждого метода get() / set() в списке JVM должна будет соответственно распаковать / пометить соответствующее значение для упомянутого метода.Помните, что автобокс принимает примитивные типы и упаковывает их в Object и наоборот, как указано в Автобокс :

Наконец, с упаковкой и распаковкой связаны затраты производительности., даже если это делается автоматически.

Я думаю, что они хотели, чтобы List выполнял простую операцию и облегчал работу всего вместе.

1 голос
/ 12 августа 2011

Общая информация о типе стирается во время выполнения.Проверьте эту ссылку .Обобщения имеют больше общего с проверкой времени компиляции, чем проверкой времени выполнения.Автобокс и распаковка являются операциями во время выполнения.Смотрите ссылку .Это причина того, что автобокс не должен работать с Generics.

0 голосов
/ 12 августа 2011

Я рад, что это невозможно, потому что int использует намного меньше памяти, чем Integer, и намного быстрее. Поэтому это заставляет меня задуматься, допустимо ли использовать Collection<Integer> или нет (часто в бизнес-приложениях это нормально, но в других приложениях это не так). Я был бы намного счастливее, если бы Collection<int> было возможно и эффективно, но это не так.

0 голосов
/ 12 августа 2011

Я не думаю, что есть какая-то техническая причина, по которой это невозможно сделать, как вы говорите, но всегда есть соображения по поводу интерфейса: например, если вы автоматически преобразовали объекты типа ArrayList<int> в ArrayList<Integer>, вы потеряете некоторые Ясность в терминах спецификаций интерфейса: менее очевидно, что ArrayList фактически хранит объектов, не примитивов.

Насколько я понимаю, автобокс предназначен больше для совместимости и гибкости типов параметров, чем для простоты возможности сказать "int" вместо "Integer". Ява не совсем известна своей одержимостью краткостью ...

Маленький PS: я не думаю, что технически было бы правильно сказать «autobox ArrayLint<int> to ArrayList<Integer>», потому что вы на самом деле ничего не оборачиваете в «коробку» объекта - вы просто фактически преобразует имя типа ArrayList<int> в «фактический» тип ArrayList<Integer>

0 голосов
/ 12 августа 2011

Я не думаю, что это какая-то проблема - есть ли у вас конкретный случай, где это каким-то образом ограничивает вас? И, между прочим, есть разница между int и Integer, в то время как объект может быть нулевым, а примитивный тип не может.

...