Sobes.tech
Middle

Čo je to wildcard v Jave?

sobes.tech AI

Odpoveď od AI

Zástupný znak (?) v Jave sa používa v generikách na reprezentáciu neznámeho typu. Umožňuje pracovať s kolekciami obsahujúcimi prvky rôznych kompatibilných typov bez prísneho viazania na konkrétny typ.

Hlavné scenáre použitia:

  1. ? (Horný obmedzený zástupný znak): Označuje akýkoľvek typ, ktorý je potomkom alebo implementuje danú triedu/rozhranie. Používa sa na čítanie dát z kolekcie. Príklad: List<? extends Number> môže obsahovať List<Integer>, List<Double>, .getList<Long>.

    // Čítanie z kolekcie s horným obmedzením
    public void processNumbers(List<? extends Number> numbers) {
        for (Number n : numbers) {
            System.out.println(n);
        }
        // numbers.add(new Integer(10)); // Chyba kompilácie - nemožno pridávať prvky
    }
    
  2. ? super (Dolný obmedzený zástupný znak): Označuje akýkoľvek typ, ktorý je predkom dané triedy/rozhrania alebo samotná táto trieda/rozhranie. Používa sa na zápis dát do kolekcie (zásada PECS: Producer Extends, Consumer Super). Príklad: List<? super Integer> môže obsahovať List<Integer>, List<Number>, List<Object>.

    // Zápis do kolekcie s dolným obmedzením
    public void addIntegers(List<? super Integer> list) {
        list.add(1);
        list.add(new Integer(2));
        // Object o = list.get(0); // Vráti Object, pretože presný typ nie je známy
    }
    
  3. ? (Neobmedzený zástupný znak): Označuje akýkoľvek typ. Ekvivalentné s ? extends Object. Používa sa, keď nie je dôležitý skutočný typ prvkov kolekcie, napríklad na kontrolu veľkosti alebo vyprázdnenie.

    // Práca s kolekciou akéhokoľvek typu
    public void printList(List<?> list) {
        for (Object obj : list) {
            System.out.println(obj);
        }
        // list.add("hello"); // Chyba kompilácie - nemožno pridávať prvky (okrem null)
    }
    

Zástupné znaky zvyšujú flexibilitu kódu, umožňujúc metódam pracovať s širším rozsahom typov kolekcií, pričom zachovávajú typovú bezpečnosť. S ich pomocou je možné vyhnúť sa duplikácii kódu pre metódy vykonávajúce rovnaké operácie nad kolekciami rôznych, ale kompatibilných typov.