Sobes.tech
Middle

Kas yra Generics ir kam jie naudojami?

sobes.tech AI

Atsakymas iš AI

Generics Java leidžia kurti klases, sąsajas ir metodus, kurie veikia su parametrizuotais tipais.

Pagrindinis Generics tikslas:

  • Didinti tipų saugumą: Kompiliatorius tikrina tipus kompiliacijos metu, užkertant kelią ClassCastException vykdymo metu.
  • Pašalinti tipų konvertavimą: Nereikia rankiniu būdu konvertuoti tipus elementų išėmimo iš kolekcijų metu.
  • Kurti lankstesnį ir pakartotinai naudojamą kodą: Galima rašyti bendrus algoritmus ir duomenų struktūras, taikomas įvairiems duomenų tipams.

Pavyzdys be Generics:

// Iki Java 5
import java.util.ArrayList;
import java.util.List;

public class OldStyleList {
    public static void main(String[] args) {
        List list = new ArrayList(); // be tipizacijos
        list.add("hello");
        list.add(123); // galima pridėti bet kurį objektą

        String s = (String) list.get(0); // reikalingas tipų konvertavimas
        Integer i = (Integer) list.get(1); // reikalingas tipų konvertavimas

        // Gali būti klaida konvertuojant tipą
        // String error = (String) list.get(1); // ClassCastException
        System.out.println(s);
        System.out.println(i);
    }
}

Pavyzdys su Generics:

// Su Generics
import java.util.ArrayList;
import java.util.List;

public class GenericList {
    public static void main(String[] args) {
        List<String> list = new ArrayList<>(); // sąrašas eilutėms
        list.add("hello");
        // list.add(123); // kompiliacijos klaida - negalima pridėti Integer

        String s = list.get(0); // nereikia tipų konvertavimo

        // Neįmanoma pridėti kito tipo, tai užkerta kelią klaidai
        // List<Integer> intList = new ArrayList<>();
        // intList.add("world"); // kompiliacijos klaida
        System.out.println(s);
    }
}

Generics taip pat naudojami:

  • Klasėse: ArrayList<E>, HashMap<K, V>
  • Sąsajose: List<E>, Map<K, V>
  • Metoduose: <T> void printArray(T[] array)
  • Tipų apribojimuose: <T extends Comparable<T>> (apribojimas tipams, įgyvendinantiems Comparable)

Java realizacija Generics grindžiama "tipų ištrynimu" (type erasure) kompilacijos metu. Tai reiškia, kad informacija apie generuotus tipus yra pašalinama, ir vykdymo metu JVM dirba su neapibrėžtais tipais. Tai užtikrina suderinamumą su senesnėmis Java versijomis, tačiau turi tam tikrų apribojimų.