Java noob: генерики только над объектами?
Я новичок в Java. При кодировании Map я обнаружил, что объявление Map
является синтаксической ошибкой, в то время как Map
в порядке. Возможно ли только в Java создавать экземпляры генериков по типам объектов, в отличие от примитивов? Если да, есть ли заметное снижение производительности для бокса / распаковки примитивов?
- Подclass classа Java Builder
- Невозможно использовать Scanner.nextInt () и Scanner.nextLine () вместе
- Как получить доступ к атрибуту запроса, установленному сервлетом в JSP?
- Java BigDecimal тригонометрические методы
- Установка короткого значения Java
- Как добавить флажок в узел JTree для управления мультиселекцией?
- Что вызывает мой java.net.SocketException: сброс соединения?
- Правильный способ проверки версии Java из сценария BASH
Да, вы можете использовать только ссылочные типы для параметров типового типа, и да, будет некоторая потеря производительности из-за бокса / распаковки (что может быть сделано автоматически по большей части).
Вот цитата из часто задаваемых вопросов 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, по одному для каждого примитивного типа (их не так много, поэтому это не проблема) и просто переопределяют методы которые ставят и получают значения в списке и ограничивают их принятием каждого примитива. Это приведет к повышению производительности и сохранению многословности общего кода списка.