Sobes.tech
Middle

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:

  1. ? (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ėti List<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ų
    }
    
  2. ? (Ž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ėti List<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
    }
    
  3. ? (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.