Sobes.tech
Middle

Milyen lehetőségeket kínálnak a Generics a Java-ban?

sobes.tech MI

Válasz az MI-től

A Java generikus típusai növelik a kód típusbiztonságát, megelőzve a futási időben fellépő típushibákat. Főbb lehetőségek:

  • Típusellenőrzés fordítási időben: A fordító ellenőrzi a generikus típusok helyes használatát, így a hibák a program futtatása előtt felismerhetők.

    // Generikus nélkül - ClassCastException lehetséges
    List list = new ArrayList();
    list.add("szöveg");
    list.add(123); // Integer hozzáadása
    String s = (String) list.get(1); // Futás közbeni hiba
    
    // Generikusokkal - fordítási hiba
    List<String> stringList = new ArrayList<>();
    stringList.add("szöveg");
    // stringList.add(123); // Fordítási hiba
    String str = stringList.get(0); // Biztonságos lekérés
    
  • Típuskonverziók (type casting) kiküszöbölése: A generikusok megszüntetik a típus szerinti explicit konverzió szükségességét kollekciók vagy paraméterezett osztályok esetén.

    // Generikusok nélkül
    List list = new ArrayList();
    list.add("Helló");
    String s = (String) list.get(0); // Explicit konverzió
    
    // Generikusokkal
    List<String> stringList = new ArrayList<>();
    stringList.add("Helló");
    String str = stringList.get(0); // Konverzió nem szükséges
    
  • Általános kód (Generics Methods, Generics Classes, Generics Interfaces) implementálása: Lehetővé teszik általános algoritmusok és adatszerkezetek létrehozását, amelyek különböző típusokkal működnek anélkül, hogy duplikálnánk a kódot.

    // Általános metódus tömb kiírására
    public static <T> void printArray(T[] array) {
        for (T element : array) {
            System.out.print(element + " ");
        }
        System.out.println();
    }
    
    // Általános osztály - értékpár
    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 támogatás: Lehetővé teszik rugalmas típuskorlátozások meghatározását paraméterezett típusokban.

    • ? (Unbounded Wildcard): Bármilyen típus.
    • ? extends T (Bounded Wildcard - felső határ): A típusnak T-nek vagy alárendelt típusának kell lennie.
    • ? super T (Bounded Wildcard - alsó határ): A típusnak T-nek vagy fölérendelt típusának kell lennie.
    // Olyan metódus, amely bármilyen típusú listát fogad
    public static void processList(List<?> list) {
        // ...
    }
    
    // Olyan metódus, amely számokat vagy azok alárendeltjeit fogadja
    public static void processNumbers(List<? extends Number> list) {
        // ...
    }
    
    // Olyan metódus, amely stringeket vagy azok fölérendeltjeit fogadja
    public static void addStrings(List<? super String> list) {
        list.add("új szöveg");
    }
    
  • Használat a Collections Framework-ben: Minden fő kollekcióosztály (List, Set, Map stb.) paraméterezett, így a kollekciók kezelése típusbiztos és kényelmes.

A generikusok a modern Java kulcsfontosságú elemei, növelve a kód megbízhatóságát és olvashatóságát.