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.
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:
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ę.
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.
public static <T extends Number> void processNumber(T number) {
// Accetta Integer, Double, Float, ecc.
System.out.println(number.doubleValue());
}
Spróbuj sam
Uzupełnij klasę generyczną Box, definiując getter getValue() zwracający T oraz setter setValue(T value), który ustawia wartość prywatnej zmiennej value.
Pokaż wskazówkę
Zapisz metody z odpowiednimi sygnaturami, używając parametru typu generycznego `T`.
Rozwiązanie dostępne po 3 próbach
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.
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
Utwórz klasę statyczną StringContainer, która implementuje interfejs Container sparametryzowany typem String. Zdefiniuj konstruktor przyjmujący parametr String i zaimplementuj metodę getItem().
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