Sobes.tech
Middle

Co je to wildcard v Java?

sobes.tech AI

Odpověď od AI

Zástupný znak (?) v jazyce Java se používá v generických typech k označení neznámého typu. Umožňuje pracovat se sbírkami obsahujícími prvky různých kompatibilních typů, aniž by bylo nutné přesně určit konkrétní typ.

Hlavní scénáře použití:

  1. ? (Horně omezený zástupný znak): Označuje jakýkoli typ, který je podtřídou nebo implementuje dané rozhraní. Používá se pro čtení dat ze sbírky. Příklad: List<? extends Number> může obsahovat List<Integer>, List<Double>, .getList<Long>.

    // Čtení ze sbírky s horním omezením
    public void processNumbers(List<? extends Number> numbers) {
        for (Number n : numbers) {
            System.out.println(n);
        }
        // numbers.add(new Integer(10)); // Chyba při kompilaci - nelze přidávat prvky
    }
    
  2. ? (Dolně omezený zástupný znak): Označuje jakýkoli typ, který je nadtřídou nebo implementuje dané rozhraní, nebo je stejný s tímto typem. Používá se pro zápis do sbírky (princip PECS: Producer Extends, Consumer Super). Příklad: List<? super Integer> může obsahovat List<Integer>, List<Number>, List<Object>.

    // Zápis do sbírky s dolním omezením
    public void addIntegers(List<? super Integer> list) {
        list.add(1);
        list.add(new Integer(2));
        // Object o = list.get(0); // Vrací Object, protože přesný typ je neznámý
    }
    
  3. ? (Neomezený zástupný znak): Označuje jakýkoli typ. Je ekvivalentní s ? extends Object. Používá se, když není důležitý přesný typ prvků kolekce, například pro kontrolu velikosti nebo vyprázdnění.

    // Práce s kolekcí libovolného typu
    public void printList(List<?> list) {
        for (Object obj : list) {
            System.out.println(obj);
        }
        // list.add("hello"); // Chyba při kompilaci - nelze přidávat prvky (kromě null)
    }
    

Wildcards zvyšují flexibilitu kódu, umožňují metodám pracovat s širším rozsahem typů kolekcí, přičemž zachovávají typovou bezpečnost. Pomocí nich lze zabránit duplicitě kódu u metod, které provádějí podobné operace s různými, ale kompatibilními typy kolekcí.