Java noob: генерики только над объектами?

Я новичок в Java. При кодировании Map я обнаружил, что объявление Map является синтаксической ошибкой, в то время как Map в порядке. Возможно ли только в Java создавать экземпляры генериков по типам объектов, в отличие от примитивов? Если да, есть ли заметное снижение производительности для бокса / распаковки примитивов?

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

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

Допустимы ли примитивные типы как аргументы типа?

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

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

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

Смотрите также

  • Эффективное Java 2nd Edition, пункт 49: Предпочитают примитивные типы для типов в штучной упаковке
  • Руководство по языку Java / Autoboxing
  • Руководство по языку Java / Generics
  • Учебники Java / Generics

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

верный.

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

Да, есть.

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

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

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

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

  • Процесс Zombie с использованием 100% CPU
  • Как преобразовать InputStream в виртуальный файл
  • Как заменить AWQ EventQueue собственной реализацией
  • Извините Java enum, чтобы добавить значение для проверки ошибки
  • Несколько строк заголовка JTable
  • Вращение формы по вертикали вокруг оси x
  • Есть ли альтернатива Maven или порт для мира .NET?
  • Почему autoReconnect = true не работает?
  • Создание треугольника с петлями
  • log4j: вывод журнала определенного classа в конкретный appender
  • Как форматировать строку даты в java?
  • Interesting Posts

    Перенаправление стандартного и выходного файла ошибки, добавляемого к одному и тому же лог-файлу

    Как добавить пользовательскую поисковую систему в Firefox?

    Разница между classами, объектами и экземплярами

    Не удалось расширить раздел Windows

    Что такое кэширование дискового пространства Btrfs?

    Удаление всех файлов, которые не соответствуют определенному шаблону – Командная строка Windows

    Изменение настройки яркости экрана на экране Android

    Исключение начального фильтра struts2 – попытался добавить JAR, но тот же результат

    Найти серийный номер шлюза без чехла

    Могу ли я установить заголовок по умолчанию для окна tmux?

    Поддержка VPN для Android

    Запретить Windows 10 устанавливать / обновлять определенный драйвер?

    Поместите один монитор системы с двумя мониторами в режим ожидания

    403 – Forbidden: Отказано в доступе. ASP.Net MVC

    Перечислить дубликаты массивов со счетом

    Давайте будем гением компьютера.