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í:
-
?(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 obsahovatList<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 } -
?(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 obsahovatList<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ý } -
?(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í.