[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"question-java-core-chto-takoe-generics":3},{"id":4,"slug":5,"topicId":6,"topicSlug":7,"topicName":8,"topicEmoji":9,"question":10,"answer":11,"codeLang":12,"codeSrc":12,"important":12,"commonMistakes":12,"modernUsage":12,"difficulty":13,"tags":14,"related":19,"progress":20,"seo":21},115,"chto-takoe-generics",2,"java-core","Java Core","☕","Что такое generics?","Generics - это технический термин, обозначающий набор свойств языка позволяющих определять и использовать обобщенные типы и методы. Обобщенные типы или методы отличаются от обычных тем, что имеют типизированные параметры.\n\nПримером использования обобщенных типов может служить Java Collection Framework. Так, класс `LinkedList\u003CE>` - типичный обобщенный тип. Он содержит параметр `E`, который представляет тип элементов, которые будут храниться в коллекции. Создание объектов обобщенных типов происходит посредством замены параметризированных типов реальными типами данных. Вместо того, чтобы просто использовать `LinkedList`, ничего не говоря о типе элемента в списке, предлагается использовать точное указание типа `LinkedList\u003CString>`, `LinkedList\u003CInteger>` и т.п.\n\n### Wildcards (подстановочные символы)\nВ generics используются подстановочные символы (wildcards):\n\n+ `?` — неограниченный подстановочный тип (unbounded wildcard), например `List\u003C?>` — список элементов неизвестного типа;\n+ `? extends T` — верхняя граница (upper bounded wildcard), означает «T или любой его подтип». Например, `List\u003C? extends Number>` может содержать `Integer`, `Double` и т.д.;\n+ `? super T` — нижняя граница (lower bounded wildcard), означает «T или любой его супертип». Например, `List\u003C? super Integer>` допускает `Integer`, `Number`, `Object`.\n\nПринцип выбора между `extends` и `super` описывается правилом **PECS** (Producer Extends, Consumer Super): если параметризованный тип является источником данных (producer), используйте `? extends T`; если потребителем данных (consumer) — `? super T`.\n\n### Стирание типов (Type Erasure)\nИнформация о параметрах типов существует только на этапе компиляции. Во время выполнения (runtime) она стирается — это называется стирание типов (type erasure). Компилятор заменяет все параметры типов их границами или `Object`, если границы не указаны, и при необходимости вставляет приведения типов. Таким образом, `List\u003CString>` и `List\u003CInteger>` на уровне байт-кода являются одним и тем же типом `List`.\n\n### Обобщённые методы (Generic Methods)\nОбобщённые методы позволяют параметризировать конкретный метод, а не весь класс:\n\n```java\npublic static \u003CT extends Comparable\u003CT>> T max(T a, T b) {\n    return a.compareTo(b) >= 0 ? a : b;\n}\n\n\u002F\u002F Вызов:\nString result = max(\"abc\", \"xyz\"); \u002F\u002F тип T выводится автоматически\n```\n\n### Ограничения generics\n+ Нельзя использовать примитивные типы в качестве параметра типа (`List\u003Cint>` — ошибка компиляции, следует использовать `List\u003CInteger>`);\n+ Нельзя создавать экземпляры параметров типа (`new T()` — ошибка компиляции);\n+ Нельзя создавать массивы параметризованных типов (`new List\u003CString>[10]` — ошибка компиляции);\n+ Из-за стирания типов нельзя использовать `instanceof` с параметризованными типами (`obj instanceof List\u003CString>` — ошибка компиляции, но `obj instanceof List\u003C?>` допустимо);\n+ Нельзя создавать обобщённые исключения (класс, расширяющий `Throwable`, не может быть параметризован).","","junior",[15,16,17,18],"core","generics","параметризация","типизация",[],null,{"title":22,"description":23,"ogTitle":24,"ogDescription":25,"keywords":26,"schemaAnswer":33,"featuredSnippetReady":34},"Что такое Generics в Java — Gymterview","Generics — набор свойств языка для определения и использования обобщённых типов и методов с типизированными параметрами. Wildcards, стирание типов, PECS.","Generics в Java — Gymterview","Generics позволяют определять обобщённые типы и методы с типизированными параметрами для типобезопасности.",[16,27,28,29,30,31,17,32],"Java","обобщённые типы","wildcards","type erasure","PECS","собеседование","Generics — это набор свойств языка, позволяющих определять и использовать обобщённые типы и методы. Обобщённые типы отличаются от обычных тем, что имеют типизированные параметры. Например, LinkedList\u003CE> — обобщённый тип с параметром E. В generics используются wildcards: ? (неограниченный), ? extends T (верхняя граница), ? super T (нижняя граница). Принцип выбора описывается правилом PECS. Информация о типах стирается в runtime (type erasure).",true]