Sobes.tech
Middle

Ce este un wildcard în Java?

sobes.tech AI

Răspuns de la AI

Caracterul joker (?) în Java este utilizat în generice pentru a reprezenta un tip necunoscut. Permite lucrul cu colecții care conțin elemente de tipuri compatibile diferite, fără a fi strict legat de un anumit tip.

Scenariile principale de utilizare:

  1. ? (Wildcards cu limită superioară): Indică orice tip care este un subtip sau implementează interfața specificată. Este folosit pentru citirea datelor dintr-o colecție. Exemplu: List<? extends Number> poate conține List<Integer>, List<Double>, .getList<Long>.

    // Citirea dintr-o colecție cu limită superioară
    public void processNumbers(List<? extends Number> numbers) {
        for (Number n : numbers) {
            System.out.println(n);
        }
        // numbers.add(new Integer(10)); // Eroare de compilare - nu se pot adăuga elemente
    }
    
  2. ? (Wildcards cu limită inferioară): Indică orice tip care este un supertip al clasei/interfeței specificate sau chiar această clasă/interfață. Este folosit pentru scrierea în colecție (principiul PECS: Producer Extends, Consumer Super). Exemplu: List<? super Integer> poate conține List<Integer>, List<Number>, List<Object>.

    // Scriere în colecție cu limită inferioară
    public void addIntegers(List<? super Integer> list) {
        list.add(1);
        list.add(new Integer(2));
        // Object o = list.get(0); // Returnează Object, deoarece tipul exact este necunoscut
    }
    
  3. ? (Wildcards fără limită): Indică orice tip. Echivalent cu ? extends Object. Este folosit când nu contează tipul exact al elementelor colecției, de exemplu, pentru verificarea dimensiunii sau pentru golire.

    // Lucru cu colecție de orice tip
    public void printList(List<?> list) {
        for (Object obj : list) {
            System.out.println(obj);
        }
        // list.add("hello"); // Eroare de compilare - nu se pot adăuga elemente (cu excepția null)
    }
    

Wildcards sporesc flexibilitatea codului, permițând metodelor să lucreze cu o gamă mai largă de tipuri de colecții, menținând în același timp siguranța tipurilor. Cu ajutorul lor, se poate evita duplicarea codului pentru metodele care efectuează operații similare pe colecții de tipuri diferite, dar compatibile.