Java

Typy generyczne w Java – praktyczny przewodnik

Abstrakt

Typy generyczne w języku Java umożliwiają na tworzenie elastycznego kodu. W zależności od przekazywanego parametru/paramentów możemy zmieniać zachowanie obiektu. Tą funkcjonalność wykorzystują listy, które w zależności od przyjmowanego parametru agregują dany typ. W materiale omawiam również metody generyczne i możliwości na wykorzystanie wildcard.

Typy generyczne w 26 min

Materiał wideo prezentuje od podstaw czym sa typy generyczne oraz jak je zaimplementować

W dalszej części artykułu przybliżę najważniejsze operacje i uzupełnienie treści wideo. W opisie filmu znajdziesz również pracę domową dla siebie, co sprawdzi czy dobrze udało Ci się przyswoić materiał 🙂

Przykład

Typ generyczny przyjmuje opcjonalnie parametr:

public class Box<T> {
    private T t;
    public void set(T t) { this.t = t; }
    public T get() { return t; }
}

Wówczas możliwe jest zaimplementowanie obiektu Box, który będzie przyjmował określony typ.

Box<String> stringBox = new Box<>();
Box<Integer> integerBox = new Box<>();

Parametr

Parametr definiowany jest w kodzie jako dowolny ciąg tekstowy. W powyższym przypadku został wykorzystana litera T. Jest ona najczęściej stosowaną nazwą dla parametru. Bez znaczenia co użyjemy to aplikacja będzie zachowywać się tak samo. Jednak ze względu na przyjęte zasady tworzenia kodu zaleca się stosowanie następujących parametrów w zależności od przeznaczenia:

  • E – Element (szeroko wykorzystywany przez Java Collections Framework)
  • K – Klucz
  • N – liczba
  • V – wartość
  • T – typ
  • S, U, V – typ drugi, trzeci, czwarty

Wildcard

Rozpatrzmy przykładek – mamy metodę, która sumuje wszystkie elementy na przyjmowanej w parametrze liście. Do metody może trafić lista double, int, float, lecz potrzeba nam zawężenia, aby nie możliwe było przesyłanie listy z wartościami typu String. Rozwiązaniem może być ograniczenie parametru listy tylko do typów dziedziczących po klasie Number.

public double trande(List<? extends Number> doubles) {
    double sum = 0;
    for (Number aDouble : doubles) {
        sum+=aDouble.doubleValue();
    }
    return sum;
}

Znak ? – wildcard pozwala na podstawienie dowolnego typu, w tym przypadku takiego, który dziedziczy po klasie Number. Taki rodzaj ograniczenia nazywa się ograniczam od góry.

Analogicznie do słowa extends można wykorzystać słowo kluczowe super. Które w działaniu będzie wymuszało podanie typu, który będzie dziedziczył po wskazanym typie. Jest to dziedziczenie od dołu.

Podsumowanie i zalety

Korzystanie z typów generycznych jest wykorzystywane w wielu językach programowania nie tylko w Java. Ich stosowanie niesie następujące korzyści:

  • kontrola typów na poziomie kompilacji, a nie dopiero w trakcie działania programu;
  • brak potrzeby rzutowania i stosowania instanceof;
  • przydatne w implementacji kolejek, list i wielu algorytmów.
Show Buttons
Hide Buttons