Kas yra wildcard Java?
sobes.tech AI
Atsakymas iš AI
Java žvaigždutė (?) naudojama generikuose kaip nežinomo tipo žymeklis. Ji leidžia dirbti su kolekcijomis, kurios turi skirtingų suderinamų tipų elementus, be griežtos priklausomybės nuo konkretaus tipo.
Pagrindiniai naudojimo scenarijai:
-
?(Viršutinė apribota žvaigždutė): Žymi bet kurį tipą, kuris yra paveldėjęs arba įgyvendina nurodytą klasę/sąsają. Naudojama duomenims skaityti iš kolekcijos: Pavyzdys:List<? extends Number>gali turėtiList<Integer>,List<Double>,.getList<Long>.// Skaitymas iš kolekcijos su viršutine riba public void processNumbers(List<? extends Number> numbers) { for (Number n : numbers) { System.out.println(n); } // numbers.add(new Integer(10)); // Klaida kompiliuojant - negalima pridėti elementų } -
?(Žemutinė apribota žvaigždutė): Žymi bet kurį tipą, kuris yra priešas nurodytai klasei/sąsajai arba pats šis tipas. Naudojama duomenims rašyti į kolekciją (PECS principas: Producer Extends, Consumer Super): Pavyzdys:List<? super Integer>gali turėtiList<Integer>,List<Number>,List<Object>.// Rašymas į kolekciją su žemutine riba public void addIntegers(List<? super Integer> list) { list.add(1); list.add(new Integer(2)); // Object o = list.get(0); // Grąžina Object, nes tikslaus tipo nežinoma } -
?(Neapribota žvaigždutė): Žymi bet kurį tipą. Ekvivalentas? extends Object. Naudojama, kai nėra svarbus faktinis elementų tipas, pvz., dydžio tikrinimui ar išvalymui:// Dirbti su bet kokio tipo kolekcija public void printList(List<?> list) { for (Object obj : list) { System.out.println(obj); } // list.add("hello"); // Klaida kompiliuojant - negalima pridėti elementų (išskyrus null) }
Žvaigždutės žymės didina kodo lankstumą, leidžia metodams dirbti su platesne kolekcijų tipų įvairove, išlaikant tipų saugumą. Jų pagalba galima išvengti kodo dubliavimo metodų, atliekant tą patį veiksmą su skirtingais, bet suderinamais tipais kolekcijose.