Узагальнення (Generics). Обмеження узагальнень

Прокрутити вниз


Заняття java – Узагальнення (Generics). Обмеження узагальнень.

Узагальнення (Generics) — це потужний механізм в Java, який дозволяє писати класи, інтерфейси та методи з параметрами типу. Заняття java – Узагальнення (Generics). Обмеження узагальнень. Узагальнення роблять код більш гнучким та безпечним, оскільки дозволяють працювати з різними типами даних, уникаючи помилок на етапі компіляції.

1. Основи узагальнень (Generics) Заняття java – Узагальнення (Generics). Обмеження узагальнень

Узагальнення дозволяють створювати класи або методи, які можуть працювати з будь-яким типом даних. Це досягається через використання **параметрів типу**, які вказуються в кутових дужках (`<T>`).

Приклад узагальненого класу:

публічний клас Box<T> {
приватне значення T;

public Box(T value) {
this.value = value;
}

public T getValue() {
повернення значення;
}

public void setValue(T value) {
this.value = value;
}
}
У цьому прикладі:

T— це **параметр типу**, який буде замінено на конкретний тип, коли клас буде використовуватися.

Використання узагальненого класу:

Box<Integer> intBox = new Box<>(123); // Клас для цілочисельного типу
System.out.println(intBox.getValue()); // Виведе 123

Box<String> strBox = new Box<>(“Привіт”); // Клас для рядка
System.out.println(strBox.getValue()); // Виведе Привіт

2. Узагальнені методи

Методи також можуть бути узагальненими, що дозволяє використовувати їх з різними типами, не створюючи для кожного типу окремий метод.

Приклад узагальненого методу:

public class Utility {
public static <T> void printArray(T[] array) {
for (T element : array) {
System.out.println(element);
}
}
}

Використання:

Integer[] numbers = {1, 2, 3, 4, 5};
Utility.printArray(numbers); // Виведе числа

String[] words = {“один”, “два”, “три”};
Utility.printArray(слова); // Виведе рядки

3. Обмеження узагальнень (Bounded Generics)

У Java узагальнення можна **обмежити** певними типами, тобто визначити, що параметр типу може бути підтипом якогось конкретного класу або інтерфейсу. Це корисно, коли потрібно, щоб узагальнений тип мав певні властивості чи методи.

Обмеження з допомогою extends

Ключове слово extends використовується для обмеження типу, що вказує, що параметр типу має бути підтипом (або самим типом) певного класу або інтерфейсу.

Приклад обмеження узагальнень:

public class NumberBox<T extends Number> {
private T number;

public NumberBox(T число) {
this.number = число;
}

public T getNumber() {
повертає число;
}

public void printDoubleValue() {
System.out.println(number.doubleValue());
}
}

Використання:

NumberBox<Integer> intBox = new NumberBox<>(10);
intBox.printDoubleValue(); // Виведе 10.0

NumberBox<Double> doubleBox = новий NumberBox<>(3.14);
doubleBox.printDoubleValue(); // Виведе 3.14

У прикладі вище параметр типу `T` обмежений типом `Number`, тому можна використовувати методи класу `Number` (такі як `doubleValue()`).

Множинні обмеження:

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

Приклад:

public class Data<T extends Number & Comparable<T>> {
private T value;

public Data(T value) {
this.value = value;
}

public T getValue() {
повернення значення;
}
}

Тут параметр типу `T` має бути підтипом класу `Number` і реалізовувати інтерфейс `Comparable`.

4. Wildcards (Шаблонні типи)

Шаблонні типи (wildcards) використовуються для забезпечення гнучкості при роботі з узагальненими типами. Найчастіше використовуються символи “?” для позначення невідомого типу.

Вид шаблонів:

  • Unbounded Wildcards (`<?>`):
    Дозволяє працювати з будь-яким типом.
    public void printBox(Box<?> box) {
    System.out.println(box.getValue());
    }
  • Upper Bounded Wildcards (`<? extends T>`):
    Обмежує невідомий тип зверху, тобто тип може бути `T` або його підтипом.
    public void printNumbers(List<? extends Number> numbers) {
    for (Number number : numbers) {
    System.out.println(number);
    }
    }
  • Lower Bounded Wildcards (`<? super T>`):
    Обмежує невідомий тип знизу, тобто тип може бути `T` або його надтипом.
    public void addNumbers(List<? super Integer> list) {
    list.add(123);
    }

5. Важливі моменти використання узагальнень

1. Типові обмеження на узагальнення:

  • Узагальнені параметри не можуть бути примітивними типами (наприклад, `int`, `char`, тощо). Для цього використовуються їх обгортки (`Integer`, `Character`, тощо).
  • Не можна створювати екземпляри узагальнених типів напряму, як-от: `new T()`.
  • Не можна використовувати оператори порівняння типів на зразок `instanceof` з узагальненими типами.

2. Типове стирання (Type Erasure):

У Java узагальнення реалізовані через механізм стиранія типів. Це означає, що інформація про тип узагальнень видаляється під час компіляції, і всі типи перетворюються на `Object`. Це гарантує зворотну сумісність із версіями Java до введення узагальнень.

Висновок. Заняття java – Узагальнення (Generics). Обмеження узагальнень

Узагальнення (Generics) дозволяють писати більш універсальний і типобезпечний код, уникаючи необхідності повторного коду для різних типів даних. Використання обмежень із узагальненнями дає змогу контролювати типи, з якими можуть працювати класи або методи, а шаблонні типи (wildcards) надають додаткову гнучкість у ситуаціях, коли тип заздалегідь невідомий.

Узагальнення (Generics)Обмеження узагальнень