CodeGym /Kursy Java /Składnia Java /Czym są generyki?

Czym są generyki?

Składnia Java
Poziom 7 , Lekcja 7
Dostępny

– 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.

Komentarze (5)
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION
Anonymous #11274698 Poziom 8, Gorzow Wielkopolski, Poland
12 września 2023
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. Może przechowywać wszystkie wartości ale do pracy z zawartością trzeba używać rzutowania bo metody nie mogą pracować na typach prostych czy po prostu nie jest tu określony typ zawartości?
l.jargielo Poziom 18, Poland, Poland
24 grudnia 2022
W poniższych przypadkach: "– Tak. Każdego typu oprócz typów prostych. Wszystkie parametry typu muszą dziedziczyć z klasy Obiekt." "– 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:" tłumaczenie wyglądałoby bardziej czytelnie gdyby nazwa klasy Object nie była tłumaczona, wszak w kodzie używamy anglojęzycznych nazw klas.
Mateusz Poziom 15, Poland, Poland
1 czerwca 2022
A jeśli napisze ArrayList<String> lista = new ArrayList<>(); to jest to samo co ArrayList<String> lista = new ArrayList<String>(); ?
2 września 2022
Zadziała, ale drugi String wg intelij jest niepotrzebny
NeoBTK Poziom 8, Katowice, Poland
26 września 2022
Zgadza się. Z tym, że to nie tyle IntelliJ ile sama Java od wersji zdaje się 1.7 nie wymaga już powtarzania typu w tych drugich nawiasach <>