Sobes.tech
Middle

Kādas iespējas ir Generics?

sobes.tech AI

Atbilde no AI

Ģeneriki ļauj izveidot parametrizētās klases, interfeisus un metodes.

Galvenās iespējas:

  • Koda atkārtota izmantošana: Izveidot universālas datu struktūras un algoritmus, kas darbojas ar jebkādiem tipiem.
  • Tipu drošība kompilācijas laikā: Tipu kļūdas tiek atklātas kompilācijas laikā, nevis izpildes laikā. Tas novērš nepieciešamību manuāli veikt tipu pārveidošanu un saistītās potenciālās kļūdas ClassCastException.
  • Lasāmības uzlabošana: Kods kļūst skaidrāks, jo skaidri norāda, ar kādiem tipiem tas strādā.

Piemēri:

  • List<T> klase var glabāt jebkāda tipa T elementus.
  • static <T> T getFirst(List<T> list) metode var atgriezt pirmo elementu no jebkāda tipa saraksta.

Generiku ierobežojumi:

  • Nav iespējams izveidot ģeneriskā tipa eksemplāru: new T().
  • Nav iespējams izmantot primitivus tipus kā tipu parametrus (piemēram, List<int> - nepareizi, jābūt List<Integer>).
  • Nav iespējams tieši izveidot ģenerisku tipu masīvus (piemēram, T[] array = new T[10] - nepareizi, jāizmanto ArrayList vai tipu pārveidošana).
  • Nav iespējams tieši izmantot statiskos laukus ar ģeneriskiem tipiem.
  • Informācija par tipiem tiek izdzēsta izpildes laikā (Type Erasure), izņemot bounded wildcards.

Wildcards un bounded Type Parameters:

  • <?>: Nezināms tips. Atļauj lasīt elementus, bet ne rakstīt.
  • <? extends T>: Augšējā robeža. Atļauj strādāt ar tipiem, kas ir T subtipi. Var lasīt T vai tā supertipu elementus, bet nevar rakstīt (izņemot null).
  • <? super T>: Apakšējā robeža. Atļauj strādāt ar tipiem, kas ir T supertipi. Var rakstīt T vai tā subtipu elementus, bet var lasīt tikai Object tipus.

Piemērs:

// Metode, kas var izdrukāt elementus no jebkura saraksta,
// kas satur `Number` subtipus
public static void printNumbers(List<? extends Number> list) {
    for (Number n : list) {
        System.out.println(n);
    }
    // list.add(new Integer(1)); // Kompilācijas kļūda
}

// Metode, kas var pievienot `Integer` sarakstam,
// kas satur `Integer` vai tā supertipus
public static void addIntegers(List<? super Integer> list) {
    list.add(new Integer(10));
    // Integer val = list.get(0); // Kompilācijas kļūda, atgriež `Object`
}