Автор оригинала: Neha.
Рассмотрим пример, в котором вам нужно составить список живых существ в определенной местности. Не имеет значения, человек это, животное или растение. Все, что имеет значение, – это живое существо. В этом случае вы бы сгруппировали их всех как “Живые существа” и не классифицировали их. Аналогично, когда вам нужно хранить какие-то данные, для вас важно содержимое, а не тип данных, и именно здесь вы используете универсальные методы. Универсальные языки в Java-это языковая функция, которая позволяет использовать универсальные типы и методы.
Что такое дженерики в Java?
Generics – термин, обозначающий набор языковых функций, связанных с определением и использованием универсальных типов и методов. Универсальные методы Java отличаются от обычных типов и методов данных. До появления дженериков мы использовали коллекцию для хранения объектов любого типа, т. е. непатентованных . Теперь универсальные шаблоны заставляют Java-программиста хранить определенный тип объектов.
Теперь, когда вы знаете, что такое дженерики в Java, давайте двинемся дальше и поймем, зачем вам нужны дженерики Java.
Почему дженерики Java?
Если вы посмотрите на классы Java collection framework, то заметите, что большинство классов принимают параметр/аргумент типа Object. В принципе, в этой форме они могут принимать любой тип Java в качестве аргумента и возвращать один и тот же объект или аргумент. Они по существу неоднородны , т. е. не имеют сходного типа.
Иногда в приложении Java тип входных данных не является фиксированным. Вход может быть целым числом , с плавающей точкой или строка Java . Чтобы назначить входные данные переменной правильного типа данных, необходимо было провести предварительные проверки. В традиционном подходе после ввода данных тип входных данных проверялся, а затем присваивался переменной нужного типа данных. При использовании этой логики длина кода и время выполнения увеличивались. Чтобы избежать этого, Были введены дженерики . Когда вы используете универсальные шаблоны, параметры в коде автоматически проверяются во время компиляции, и он устанавливает тип данных по умолчанию. Итак, вот где вам нужна концепция дженериков в Java.
Теперь, когда вы получили некоторое представление о универсальных кодах, давайте продвинемся вперед и рассмотрим различные способы применения универсальных кодов к исходному коду.
Типы обобщений Java
Существует 4 различных способа применения дженериков в Java, и они заключаются в следующем:
- Класс универсального Типа
- Универсальный Интерфейс
- Общий Метод
- Универсальный Конструктор
Теперь давайте разберемся, как обобщения могут быть применены к классу типов в глубине.
1. Класс универсального Типа
Класс считается универсальным, если он объявляет одну или несколько переменных типа. Эти типы переменных известны как параметры типа класса Java. Давайте разберемся в этом с помощью примера. В приведенном ниже примере я создам класс с одним свойством x и типом свойства является объект.
class Genericclass{ private Object x; public void set(Object x) { this.x = x; } public Object get() { return x; } }
Здесь, как только вы инициализируете класс определенным типом, класс должен использоваться только с этим конкретным типом. Например, если вы хотите, чтобы один экземпляр класса содержал значение x типа ‘ String ‘, то программист должен установить и получить единственный строковый тип. Поскольку я объявил тип свойства Object, нет способа применить это ограничение. Программист может задать любой объект и может ожидать любого типа возвращаемого значения от метода get , поскольку все типы Java являются подтипами класса объектов.
Для обеспечения соблюдения этого типа ограничений мы можем использовать универсальные методы, как показано ниже:
class Genericclass{ //T stands for "Type" private T x; public void set(T x) { this.x = x; } public T get() { return x; } }
Теперь вы можете быть уверены, что класс не будет использоваться неправильно с неправильными типами. Простой пример “общего класса” выглядит так, как показано ниже:
Genericclassinstance = new Genericclass (); instance.set("Edureka"); instance.set(10); //This will raise compile time error
Так вот как это работает. Эта аналогия справедлива и для интерфейса. Давайте быстро рассмотрим пример, чтобы понять, как информация о типах обобщений может использоваться в интерфейсах на java.
2. Универсальный Интерфейс
Интерфейс в Java относится к абстрактным типам данных. Они позволяют управлять коллекциями Java независимо от деталей их представления. Кроме того, они образуют иерархию в объектно-ориентированном программировании языках. Давайте разберемся, как универсальный тип может быть применен к интерфейсам в Java.
//Generic interface definition interface GenericInterface{ T2 PerformExecution(T1 x); T1 ReverseExecution(T2 x); } //A class implementing generic interface class Genericclass implements GenericInterface { public Integer PerformExecution(String x) { //execution code } public String ReverseExecution(Integer x) { //execution code } }
Я надеюсь, что вы смогли понять, как универсальные типы могут быть применены к классу типов и интерфейсам. Теперь давайте углубимся в эту статью и поймем, насколько она полезна для методов и конструкторов.
3. Общие Методы
Универсальные методы во многом похожи на универсальные классы. Они отличаются друг от друга только в одном аспекте: информация о области или типе находится только внутри метода. Универсальные методы вводят свои собственные параметры типа.
Давайте разберемся в этом на примере. Ниже приведен пример универсального метода, который можно использовать для поиска всех вхождений параметров типа в списке переменных.
public staticint countAllOccurrences(T[] list, T element) { int count = 0; if (element == null) { for ( T listElement : list ) if (listElement == null) count++; } else { for ( T listElement : list ) if (element.equals(listElement)) count++; } return count; }
Если вы передадите список строк для поиска в этом методе, он будет работать нормально. Но если вы попытаетесь найти число в списке строк, это приведет к ошибке во время компиляции.
Эта аналогия аналогична и конструктору. Давайте возьмем пример универсального конструктора и поймем, как он работает.
4. Универсальный Конструктор
Конструктор – это блок кода, который инициализирует вновь созданный объект. конструктор напоминает метод экземпляра в Java но это не метод, так как у него нет возвращаемого типа. Конструктор имеет то же имя, что и класс, и выглядит так в коде Java. Теперь давайте возьмем пример и поймем, как это работает.
class Dimension{ private T length; private T width; private T height; //Generic constructor public Dimension(T length, T width, T height) { super(); this.length = length; this.width = width; this.height = height; } }
В приведенном выше примере конструктор класса измерений содержит информацию о типе. Таким образом, у вас может быть экземпляр измерения со всеми атрибутами только одного типа. Итак, вот как вы можете использовать конструкторы универсальных типов. Я надеюсь, вы поняли типы дженериков в Java.
Теперь давайте двинемся дальше и рассмотрим преимущества дженериков в Java.
Преимущества дженериков в Java
1. Возможность повторного использования Кода
Вы можете создать стратегию, класс или интерфейс один раз и использовать их для любого типа или любым способом, который вам нужен.
2. Кастинг отдельных типов не требуется
В принципе, вы каждый раз восстанавливали информацию из ArrayList, вам нужно ее типизировать. Типизация при каждой задаче восстановления-это серьезная мигрень. Чтобы искоренить этот подход, были введены дженерики.
3. Реализация нестандартного алгоритма
Он может вычислять алгоритмы, которые работают с различными типами элементов, которые также являются типобезопасными.
Это было все о преимуществах дженериков Java. На этом мы подходим к концу этой статьи о дженериках в Java. Я надеюсь, что вы нашли его информативным и помогли вам в понимании универсалий Java.
У вас есть к нам вопрос? Пожалуйста, укажите это в разделе комментариев этой статьи, и мы свяжемся с вами как можно скорее.
Оригинал: “https://www.codementor.io/@nehavaidya/what-is-generics-in-java-a-beginners-guide-to-learn-generics-w371wnbcv”