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ą
ClassCastExceptionvykdymo 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, įgyvendinantiemsComparable)
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ų.