Sobes.tech
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üübi T elemente.
  • 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 olema List<Integer>).
  • Ei ole võimalik otse luua üldtüüpi massiive (näiteks, T[] array = new T[10] - vale, kasutada tuleb ArrayList võ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 on T alamliigid. Võib lugeda T või selle supertüübi elemente, kuid mitte kirjutada (välja arvatud null).
  • <? super T>: Alumine piirang. Annab võimaluse töötada tüüpidega, mis on T supertüübid. Võib kirjutada T või selle alamliigid, kuid lugeda ainult Object tüü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`
}