Middle
Millised võimalused on Generics?
sobes.tech AI
Vastus AI-lt
Generics võimaldavad luua parametriseeritud klasse, liideseid ja meetodeid.
Peamised võimalused:
- Koodi taaskasutus: Luua universaalseid andmestruktuure ja algoritme, mis töötavad iga tüübi puhul.
- Tüüpide turvalisus kompileerimise ajal: Tüübivead avastatakse kompileerimise ajal, mitte käivitamise ajal. See kõrvaldab vajaduse käsitsi tüüpide konverteerimiseks ja seotud potentsiaalselt vigade
ClassCastException. - Lugemise parandamine: Kood muutub arusaadavamaks, kuna näitab selgelt, milliste tüüpidega ta töötab.
Näited:
List<T>klass võib hoida ükskõik millise tüübiTelemente.static <T> T getFirst(List<T> list)meetod võib tagastada esimese elemendi ükskõik millise tüübi listist.
Generics piirangud:
- Ei ole võimalik luua üldise tüübi eksemplare:
new T(). - Ei ole võimalik kasutada primitiivseid tüüpe tüübi parameetritena (näiteks,
List<int>- vale, peab olemaList<Integer>). - Ei ole võimalik otse luua üldtüüpi massiive (näiteks,
T[] array = new T[10]- vale, kasutada tulebArrayListvõi tüübi konversiooni). - Ei ole võimalik otse kasutada staatilisi välju üldtüüpi.
- Tüüpide teave kaob käivitamise ajal (Type Erasure), välja arvatud bounded wildcards.
Wildcards ja bounded Type Parameters:
<?>: Teadmata tüüp. Annab võimaluse lugeda elemente, kuid mitte kirjutada.<? extends T>: Ülemine piirang. Annab võimaluse töötada tüüpidega, mis onTalamliigid. Võib lugedaTvõi selle supertüübi elemente, kuid mitte kirjutada (välja arvatudnull).<? super T>: Alumine piirang. Annab võimaluse töötada tüüpidega, mis onTsupertüübid. Võib kirjutadaTvõi selle alamliigid, kuid lugeda ainultObjecttüüpi.
Näide:
// Meetod, mis võib printida elemente igast nimekirjast,
// mis sisaldab `Number` alamliike
public static void printNumbers(List<? extends Number> list) {
for (Number n : list) {
System.out.println(n);
}
// list.add(new Integer(1)); // Kompileerimisviga
}
// Meetod, mis võib lisada `Integer`-i nimekirja,
// mis sisaldab `Integer`-i või selle supertüüpe
public static void addIntegers(List<? super Integer> list) {
list.add(new Integer(10));
// Integer val = list.get(0); // Kompileerimisviga, tagastab `Object`
}