Java noob: дженерики только для объектов? - PullRequest
8 голосов
/ 10 июня 2010

Я новичок в Java.При кодировании карты <> я обнаружил, что объявление Map<int, int> является синтаксической ошибкой, а Map<Integer, Integer> в порядке.Можно ли только в Java создавать экземпляры обобщенных типов для типов объектов, а не для примитивов?Если да, есть ли заметное снижение производительности при упаковке / распаковке примитивов?

Ответы [ 4 ]

11 голосов
/ 10 июня 2010

Да, вы можете использовать ссылочные типы только для параметров универсального типа, и да, будет некоторое снижение производительности из-за упаковки / распаковки (что может быть выполнено автоматически по большей части).

Вотцитата из часто задаваемых вопросов по Java Generics :

Разрешены ли примитивные типы в качестве аргументов типа?

Нет.В качестве аргументов типа могут использоваться только ссылочные типы.Параметризованный тип, такой как List<int> или Set<short>, недопустим.Только эталонные типы могут использоваться для создания экземпляров универсальных типов и методов.Вместо List<int> мы должны объявить List<Integer>, используя соответствующий тип обертки в качестве аргумента типа.

[...] Обратите внимание, что отсутствие экземпляров примитивного типа влечет за собой снижение производительности.Autoboxing и -unboxing делают использование экземпляров универсальных типов для типов-оболочек очень удобным и лаконичным в исходном коде.Но краткая запись скрывает тот факт, что за кулисами виртуальная машина создает и использует множество объектов-оболочек, каждый из которых должен быть выделен, а затем собран мусор.Более высокая производительность прямого использования значений примитивных типов не может быть достигнута с универсальными типами.Только обычный тип может обеспечить оптимальную производительность при использовании значений примитивного типа.

Если вам абсолютно необходима производительность, Trove имеет много структур данных, специализированных для примитивных типов, но для большинстваВ практических целях использование примитивных типов в штучной упаковке с классами Java Collections Framework должно дать более приемлемую производительность.

См. также

2 голосов
/ 10 июня 2010

1) Да, дженерики Java работают только с типами объектов.Это из-за того, как они реализованы, что происходит через стирание типов - по сути, после того, как он скомпилирован в байт-код, все универсальные типы заменяются на Object - это было сделано для того, чтобы java-генерики могли работать безизменение базовой JVM / байт-кода (плохое решение, IMO).

2) Да, будут некоторые штрафы за бокс / распаковку;Боюсь, этого не избежать.

2 голосов
/ 10 июня 2010

Возможно ли только в Java создавать экземпляры обобщений над объектом типы, в отличие от примитивов?

правильный.

Если это так, есть ли заметное снижение производительности за бокс / распаковка примитивов?

Да, есть.

Смотрите подробное описание здесь: http://java.sun.com/j2se/1.5.0/docs/guide/language/autoboxing.html

0 голосов
/ 10 июня 2010

Как уже отмечали другие, за использование классов-оболочек для примитивов снижается производительность.И хотя стоимость не очень заметна, если вам ОЧЕНЬ нужно дополнительное повышение производительности, вы можете просто создать собственные подклассы для класса List, по одному для каждого примитивного типа (их не много, так что это не проблема) и просто переопределить методыкоторые помещают и получают значения в списке и ограничивают их принятием каждого примитива.Это приведет к повышению производительности и сохранит многословность общего списка кода.

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