Č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:
-
?(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 } -
? 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 } -
?(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.