Sobes.tech
Middle

Kokias galimybes suteikia Generics Java?

sobes.tech AI

Atsakymas iš AI

Generics Java kalba kodų tipų saugumą didina, užkertant kelią vykdymo metu atsirandantiems klaidoms, susijusioms su tipų konvertavimu. Pagrindinės galimybės:

  • Tipų tikrinimas kompiliacijos metu: Kompiliatorius tikrina, ar teisingai naudojami Generics nurodyti tipai, leidžiantys aptikti klaidas prieš programos paleidimą.

    // Be Generics - gali būti ClassCastException
    List list = new ArrayList();
    list.add("eilutė");
    list.add(123); // Integer pridėjimas
    String s = (String) list.get(1); // Vykdymo klaida
    
    // Su Generics - klaida kompiliuojant
    List<String> stringList = new ArrayList<>();
    stringList.add("eilutė");
    // stringList.add(123); // Kompiliatoriaus klaida
    String str = stringList.get(0); // Saugi gavimas
    
  • Tipų konvertavimo (type casting) pašalinimas: Generics pašalina poreikį aiškiai konvertuoti tipus gaunant elementus iš kolekcijų ar naudojant parametrizuotas klases.

    // Be Generics
    List list = new ArrayList();
    list.add("Labas");
    String s = (String) list.get(0); // Aiškus konvertavimas
    
    // Su Generics
    List<String> stringList = new ArrayList<>();
    stringList.add("Labas");
    String str = stringList.get(0); // Konvertavimas nereikalingas
    
  • Bendras kodas (Generics Methods, Generics Classes, Generics Interfaces): Leidžia kurti bendrus algoritmus ir duomenų struktūras, kurios veikia su įvairiais tipais, nesikartojant kodo.

    // Bendra metodo funkcija spausdinti masyvą
    public static <T> void printArray(T[] array) {
        for (T element : array) {
            System.out.print(element + " ");
        }
        System.out.println();
    }
    
    // Bendra klasė - reikšmių pora
    class Pair<K, V> {
        private K key;
        private V value;
    
        public Pair(K key, V value) {
            this.key = key;
            this.value = value;
        }
    
        public K getKey() { return key; }
        public V getValue() { return value; }
    }
    
  • Wildcards palaikymas: Leidžia apibrėžti lankstesnius apribojimus tipams parametrizuotuose tipuose.

    • ? (Unbounded Wildcard): Bet koks tipas.
    • ? extends T (Bendras Wildcard - viršutinė riba): Tipas turi būti T arba jo potipis.
    • ? super T (Bendras Wildcard - apatinė riba): Tipas turi būti T arba jo supertipas.
    // Metodas, priimantis bet kokio tipo sąrašą
    public static void processList(List<?> list) {
        // ...
    }
    
    // Metodas, priimantis skaičių sąrašą arba jų potipius
    public static void processNumbers(List<? extends Number> list) {
        // ...
    }
    
    // Metodas, priimantis eilutės sąrašą arba jų supertipus
    public static void addStrings(List<? super String> list) {
        list.add("nauja eilutė");
    }
    
  • Naudojimas Collections Framework: Visos pagrindinės kolekcijų klasės (List, Set, Map ir kt.) yra parametrizuotos, todėl darbą su kolekcijomis galima saugiai ir patogiai atlikti.

Generics yra svarbus šiuolaikinės Java elementas, kuris didina kodo patikimumą ir skaitomumą.