Рубрики
Без рубрики

Дженерики на Java

Всем привет! В этой статье мы узнаем о Java Generics, о том, как создать универсальный класс и… С тегом java, производительность, программирование.

Всем привет! В этой статье мы узнаем о Java Generics, о том, как создать универсальный класс и методы, о его преимуществах и о том, как их можно использовать для улучшения качества нашего кода.

Java Generics были введены в JDK 5.0 с целью уменьшения ошибок и добавления дополнительного уровня абстракции над типами. Дженерики означают параметризованные типы. Java Generics позволяет нам создавать единый класс, интерфейс и метод, которые можно использовать с различными типами данных (объектов), и это помогает нам повторно использовать наш код.

Универсальные методы – это те методы, которые записываются с помощью одного объявления метода и могут вызываться с аргументами разных типов.

Дженерики также обеспечивают безопасность типов во время компиляции, что позволяет программистам перехватывать недопустимые типы во время компиляции.

” Важно отметить, что Generics не работает с примитивными типами (int, float, char и т.д.).”

Почему Дженерики?

Допустим, мы хотим создать список в Java для хранения целых чисел; у нас может возникнуть соблазн написать:

List list = new LinkedList();
list.add(new Integer(1)); 
Integer i = list.iterator().next();

Компилятор будет жаловаться на последнюю строку, поскольку он не знает, какой тип данных возвращается, и для этого требуется явное приведение:

Integer i = (Integer) list.iterator.next();

Теперь это приведение может раздражать, мы знаем, что тип данных в этом списке – целое число. Приведение также загромождает наш код. Это может привести к ошибкам во время выполнения, связанным с типом, если программист допустит ошибку с явным приведением.

Было бы намного проще, если бы программисты могли выразить свое намерение использовать определенные типы, а компилятор мог бы обеспечить корректность такого типа. Это основная идея дженериков.

Давайте теперь изменим код..

List list = new LinkedList<>();

Добавляя оператор <>, содержащий тип, мы сужаем специализацию этого списка только до целочисленного типа, то есть указываем тип, который будет храниться внутри списка. Затем компилятор может применить этот тип во время компиляции. Это может повысить значительную надежность и облегчить чтение программы.

Мы можем создать класс, который можно использовать с любым типом данных. Такой класс известен как класс Generics. Вот как мы можем создать универсальный класс в Java:

class Main {
  public static void main(String[] args) {

    // initialize generic class with Integer data

    GenericsClass intObj = new GenericsClass<>(5);
    System.out.println("Generic Class returns: " + intObj.getData());

    // initialize generic class with string data

    GenericsClass stringObj = new GenericsClass<>("Java Programming");
    System.out.println("Generic Class returns: " + stringObj.getData());
  }
}

// create a generics class
class GenericsClass {

  // variable of T type
  private T data;

  public GenericsClass(T data) {
    this.data = data;
  }

  // method that return T type variable
  public T getData() {
    return this.data;
  }
}

Результат

Generic Class returns: 5
Generic Class returns: Java Programming

Здесь мы создали универсальный класс с именем Generic class, и этот класс можно использовать для работы с любым типом данных.

class GenericsClass {...}

Здесь T, используемое внутри угловой скобки <>, указывает на параметр типа. Внутри основного класса мы создали два объекта универсального класса

intObj – Здесь параметр типа T заменяется целым числом. Теперь класс Generics работает с целочисленными данными.

string Obj – Здесь параметр типа T заменяется на String. Теперь класс Generics работает со строковыми данными.

Мы также можем создать метод, который можно использовать с любым типом данных. Такой класс известен как метод Generics.

Вот как мы можем создать универсальный класс в Java:

class Main {
  public static void main(String[] args) {

    // initialize the class with Integer data
    DemoClass demo = new DemoClass();

    // generics method working with String
    demo.genericsMethod("Java Programming");

    // generics method working with integer
    demo.genericsMethod(25);
  }
}

class DemoClass {

  // creae a generics method
  public  void genericsMethod(T data) {
    System.out.println("Generics Method:");
    System.out.println("Data Passed: " + data);
  }
}

Результат

Generics Method:
Data Passed: Java Programming
Generics Method:
Data Passed: 25

Итак, в приведенном выше коде мы создали универсальный метод с именем generics Method.

public  void genericMethod(T data) {...}

Мы можем вызвать универсальный метод, поместив фактический тип и внутри скобки перед именем метода.

demo.genericMethod("Java Programming");

demo.genericMethod(25);

Мы можем вызвать универсальный метод, не включая параметр type. Например,

demo.genericsMethod("Java Programming");

Ограниченные типы

Давайте взглянем на Ограниченные типы. Параметр type может принимать любые типы данных (кроме примитивных типов).

Ограниченный означает “ограниченный”, мы можем ограничить типы, которые могут быть приняты методом.

Если мы хотим использовать дженерики только для некоторых определенных типов (например, принимать данные числовых типов или принимать данные строковых типов), тогда мы можем использовать ограниченные типы.

В случае связанных типов мы используем ключевое слово extends.


Это означает, что T может принимать только те данные, которые являются подтипами A.

class GenericsClass  {

  public void display() {
    System.out.println("This is a bounded type generics class.");
  }
}

class Main {
  public static void main(String[] args) {

    // create an object of GenericsClass
    GenericsClass obj = new GenericsClass<>();
  }
}

В приведенном выше коде мы создали класс с именем Generic class. Обратите внимание на выражение Универсальный класс создается с ограниченным типом. Это означает, что универсальный класс может работать только с типами данных, которые являются дочерними элементами Number (Integer, Double и так далее).

Преимущества дженериков

Это способствует повторному использованию кода : С помощью дженериков в Java мы можем написать код, который будет работать с различными типами данных.

public  void genericsMethod(T data) {...}

Описанный выше метод можно использовать для выполнения операций с целочисленными данными, строковыми данными и так далее.

Безопасность типа

Всегда лучше знать о проблемах в вашем коде во время компиляции, чем вызывать сбой вашего кода во время выполнения

Дженерики приводят к появлению ошибок во время компиляции, а не во время выполнения.

// using Generics
GenericsClass list = new GenericsClass<>();

Здесь мы знаем, что класс Generics работает только с целочисленными данными.

Если мы попытаемся передать в этот класс данные, отличные от Integer, программа выдаст ошибку во время компиляции.

Кастинг индивидуального типа не требуется

// Using generics converts run time exceptions into
// compile time exception.
import java.util.*;

class Test
{
    public static void main(String[] args)
    {
        // Creating a an ArrayList with String specified
        ArrayList  al = new ArrayList ();

        al.add("Success");
        al.add("Gideon");


        String s1 = (String)al.get(0);
        String s2 = (String)al.get(1);

    }
}

Если мы не используем дженерики, то в приведенном выше примере каждый раз, когда мы извлекаем данные из ArrayList, нам приходится вводить их тип. Набор типов при каждой операции поиска может быть довольно напряженным, на самом деле раздражающим. Если мы уже знаем, что наш список содержит только строковые данные, то нам не нужно вводить его каждый раз.

// We don't need to typecast individual members of ArrayList
import java.util.*;

class Test
{
    public static void main(String[] args)
    {
        // Creating a an ArrayList with String specified
        ArrayList  al = new ArrayList ();

        al.add("Success");
        al.add("Gideon");

        // Typecasting is not needed
        String s1 = al.get(0);
        String s2 = al.get(1);
    }
}

Вывод

Generics – это мощное дополнение к языку Java, поскольку оно облегчает работу программиста и снижает вероятность ошибок. Дженерики обеспечивают корректность типов во время компиляции, и это позволяет реализовывать универсальные алгоритмы, не вызывая каких-либо дополнительных накладных расходов для наших приложений.

Спасибо за чтение! Пожалуйста, пишите комментарии, если вы обнаружите что-то неправильное или хотите поделиться дополнительной информацией по обсуждаемой выше теме.

Свяжитесь со мной: Твиттер: https://twitter.com/DaCodess Instagram: https://instagram.com/realsuccess ._ сеть LinkedIn: https://www.linkedin.com/in/success-godday-2772651b2/

Оригинал: “https://dev.to/thecodess/generics-in-java-1np5”