Przejdź do głównej treści
eLearner.app
Moduł 6 · Lekcja 2 z 212/14 w kursie~15 min
Lekcje modułu (2/2)

Typy Generyczne w Javie

Typy generyczne (Generics) zostały wprowadzone w Javie, aby umożliwić klasom, interfejsom i metodom operowanie na różnych typach przekazywanych jako parametry, zapewniając kontrolę typów w czasie kompilacji (Compile-time Type Safety) i unikając kosztownego, jawnego rzutowania typów w czasie wykonywania programu.

Klasy generyczne

Klasa generyczna jest definiowana za pomocą nawiasów ostrokątnych <T>, gdzie T reprezentuje symbol zastępczy (placeholder) dla typu, który zostanie określony w momencie tworzenia instancji.

Code
public class Box<T> {
    private T content;

    public void setContent(T content) {
        this.content = content;
    }

    public T getContent() {
        return content;
    }
}

Kiedy tworzymy obiekt typu Box, określamy rzeczywisty typ:

Code
Box<Integer> integerBox = new Box<>();
integerBox.setContent(123);
int value = integerBox.getContent(); // Nessun cast necessario!

Metody generyczne

Możliwe jest zdefiniowanie pojedynczej metody generycznej zdolnej do akceptowania różnych parametrów typów. Parametr typu umieszcza się przed typem zwracanym przez metodę.

Code
public static <E> void printArray(E[] elements) {
    for (E element : elements) {
        System.out.println(element);
    }
}

Ograniczenia typów generycznych (Wildcards)

Możemy ograniczyć typy akceptowane przez typ generyczny za pomocą słowa kluczowego extends (ograniczenie górne), aby akceptować określony typ lub jego klasy pochodne.

Code
public static <T extends Number> void processNumber(T number) {
    // Accetta Integer, Double, Float, ecc.
    System.out.println(number.doubleValue());
}

Spróbuj sam

Ćwiczenie#java.m6.l2.e1
Próby: 0Ładowanie...

Uzupełnij klasę generyczną Box, definiując getter getValue() zwracający T oraz setter setValue(T value), który ustawia wartość prywatnej zmiennej value.

Ładowanie edytora...
Pokaż wskazówkę

Zapisz metody z odpowiednimi sygnaturami, używając parametru typu generycznego `T`.

Rozwiązanie dostępne po 3 próbach

Ćwiczenie#java.m6.l2.e2
Próby: 0Ładowanie...

Utwórz statyczną metodę generyczną printArray, która przyjmuje jako argument tablicę typu T[] o nazwie array i wypisuje każdy jej element za pomocą pętli for-each.

Ładowanie edytora...
Pokaż wskazówkę

Parametr typu `<T>` powinien być umieszczony bezpośrednio po `static`, a przed typem zwracanym `void`.

Rozwiązanie dostępne po 3 próbach

Ćwiczenie#java.m6.l2.e3
Próby: 0Ładowanie...

Utwórz klasę statyczną StringContainer, która implementuje interfejs Container sparametryzowany typem String. Zdefiniuj konstruktor przyjmujący parametr String i zaimplementuj metodę getItem().

Ładowanie edytora...
Pokaż wskazówkę

Zastąp typ generyczny `T` typem `String` w sygnaturze klasy oraz w typie zwracanym metody `getItem()`.

Rozwiązanie dostępne po 3 próbach