Sobes.tech
Middle

Ce posibilități oferă Generics în Java?

sobes.tech AI

Răspuns de la AI

Generics în Java îmbunătățesc siguranța tipurilor de cod, prevenind erorile de timp de execuție legate de conversia tipurilor. Principalele caracteristici:

  • Verificarea tipurilor în timpul compilării: Compilatorul verifică utilizarea corectă a tipurilor specificate în Generics, ceea ce permite identificarea erorilor înainte de rularea programului.

    // Fără Generics - posibil ClassCastException
    List list = new ArrayList();
    list.add("șir");
    list.add(123); // Adăugare Integer
    String s = (String) list.get(1); // Eroare la rulare
    
    // Cu Generics - eroare de compilare
    List<String> stringList = new ArrayList<>();
    stringList.add("șir");
    // stringList.add(123); // Eroare de compilare
    String str = stringList.get(0); // Obținere sigură
    
  • Eliminarea conversiilor de tipuri (type casting): Generics elimină necesitatea conversiilor explicite la obținerea elementelor din colecții sau utilizarea claselor parametrizate.

    // Fără Generics
    List list = new ArrayList();
    list.add("Salut");
    String s = (String) list.get(0); // Conversie explicită
    
    // Cu Generics
    List<String> stringList = new ArrayList<>();
    stringList.add("Salut");
    String str = stringList.get(0); // Nu este nevoie de conversie
    
  • Implementarea codului generic (Metode generice, Clase generice, Interfețe generice): Permite crearea de algoritmi și structuri de date generice care funcționează cu diferite tipuri, fără a duplica codul.

    // Metodă generică pentru imprimarea unui array
    public static <T> void printArray(T[] array) {
        for (T element : array) {
            System.out.print(element + " ");
        }
        System.out.println();
    }
    
    // Clasă generică - pereche de valori
    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; }
    }
    
  • Suport pentru Wildcards: Permite definirea restricțiilor flexibile asupra tipurilor în tipurile parametrizate.

    • ? (Wildcard nelimitat): Orice tip.
    • ? extends T (Wildcard cu limită superioară): Tipul trebuie să fie T sau un subtip al său.
    • ? super T (Wildcard cu limită inferioară): Tipul trebuie să fie T sau un supertip al său.
    // Metodă care acceptă o listă de orice tip
    public static void processList(List<?> list) {
        // ...
    }
    
    // Metodă care acceptă o listă de numere sau subtipurile lor
    public static void processNumbers(List<? extends Number> list) {
        // ...
    }
    
    // Metodă care acceptă o listă de șiruri sau supertipurile lor
    public static void addStrings(List<? super String> list) {
        list.add("șir nou");
    }
    
  • Utilizare în cadrul framework-ului Collections: Toate clasele principale de colecții (List, Set, Map etc.) sunt parametrizate, ceea ce face ca lucrul cu colecțiile să fie sigur în tipuri și convenabil.

Generics sunt un element cheie al Java modern, sporind fiabilitatea și lizibilitatea codului.