– Kolejny świetny temat.

– Ile tych niespodzianek! Czy dziś są moje urodziny?

– Dzisiaj opowiem Ci o generykach. Generyki to typy, które mają parametr. W Javie klasy kontenera pozwalają Ci wskazać typ swych wewnętrznych obiektów.

– Kiedy deklarujemy zmienną generyczną, wskazujemy dwa typy zamiast jednego: typ zmiennej i typ przechowywanych przez nią danych.

– ArrayList to dobry przykład. Kiedy tworzymy nowy obiekt ArrayList, wygodnie jest wskazać typ wartości, które będą przechowywane wewnątrz tej listy.

Kod Wyjaśnienie
ArrayList<String> lista = new ArrayList<String>();
Utwórz zmienną ArrayList o nazwie lista.
Przypisz do niej obiekt ArrayList.
W tym przypadku lista może przechowywać tylko obiekty typu String.
ArrayList lista = new ArrayList();
Utwórz zmienną ArrayList o nazwie lista.
Przypisz do niej obiekt ArrayList. W tym przypadku lista może przechowywać wszystkie wartości.
ArrayList<Integer> lista = new ArrayList<Integer>();
Utwórz zmienną ArrayList o nazwie lista.
Przypisz do niej obiekt ArrayList.
W tym przypadku lista może przechowywać tylko wartości Integer i int (pol. liczb całkowitych).

– To super interesujące. Szczególnie ta część o przechowywaniu wartości każdego typu.

– Dobrze to słyszeć. W rzeczywistości, jeśli umieścimy wartości typu String w ArrayList w jednej metodzie i oczekujemy, że będzie ona zawierała liczby z innej metody, to program się zawiesi (zakończy błędem).

– Rozumiem.

– Póki co nie będziemy tworzyć naszej własnej klasy z parametrami typu. Użyjemy po prostu tych już istniejących.

– Czy każda klasa może być parametrem typu, nawet taka, którą sam napiszę?

– Tak. Każdego typu oprócz typów prostych. Wszystkie parametry typu muszą dziedziczyć z klasy Obiekt.

Masz na myśli, że nie mogę napisać ArrayList<int>?

– Dokładnie, nie możesz. Ale programiści Java napisali klasy osłonowe (opakowujące) dla każdego typu prostego. Te klasy dziedziczą/przejmują Obiekt. Wygląda to tak:

Typ prosty Klasa List
int Integer ArrayList<Integer>
double Double ArrayList<Double>
boolean Boolean ArrayList<Boolean>
char Character ArrayList<Character>
byte Byte ArrayList<Byte>

– Bez problemu możesz przypisać do siebie klasy proste i te do nich analogiczne.

Przykłady
int a = 5;
            Integer b = a;
            int c = b;
Character c = 'c';  // Literał (znakowy) c posiada typ char
char d = c;
Byte b = (byte) 77;  // Literał (znakowy) 77 posiada typ int
Boolean isOk = true;  //Literał true jest boolean
Double d = 1.0d;  // Literał 1.0d jest double

– Świetnie. Myślę, że będę teraz częściej używał ArrayList.