Sobes.tech
Middle

Mis on wildcard Java's?

sobes.tech AI

Vastus AI-lt

Java-s ? wildcards kasutatakse üldistes (generics) kontekstis teadmata tüübi tähistamiseks. See võimaldab töötada kogumitega, mis sisaldavad erinevate sobivate tüüpide elemente, ilma rangelt konkreetsele tüübile allutamata.

Peamised kasutusstsenaariumid:

  1. ? (Ülemine piiratud wild card): Näitab mis tahes tüüpi, mis pärib või rakendab määratud klassi/liidest. Kasutatakse andmete lugemiseks kogumist: Näide: List<? extends Number> võib sisaldada List<Integer>, List<Double>, .getList<Long>.

    // Lugemine kogumist ülemise piiranguga
    public void processNumbers(List<? extends Number> numbers) {
        for (Number n : numbers) {
            System.out.println(n);
        }
        // numbers.add(new Integer(10)); // Korrigeerimisel viga - elemente ei saa lisada
    }
    
  2. ? (Alumine piiratud wild card): Näitab mis tahes tüüpi, mis on määratud klassi/liidese eelkäija või ise see klass/liides. Kasutatakse andmete kirjutamiseks kogumisse (PECS põhimõte: Producer Extends, Consumer Super): Näide: List<? super Integer> võib sisaldada List<Integer>, List<Number>, List<Object>.

    // Kirjutamine kogumisse alumise piiranguga
    public void addIntegers(List<? super Integer> list) {
        list.add(1);
        list.add(new Integer(2));
        // Object o = list.get(0); // Tagastab Object, kuna täpne tüüp teadmata
    }
    
  3. ? (Piiramatu wild card): Näitab mis tahes tüüpi. Ekvivalentne ? extends Object. Kasutatakse, kui elementide tegelik tüüp ei ole oluline, näiteks suuruse kontrollimiseks või puhastamiseks:

    // Töötamine mis tahes tüüpi kogumiga
    public void printList(List<?> list) {
        for (Object obj : list) {
            System.out.println(obj);
        }
        // list.add("hello"); // Korrigeerimisel viga - elemente ei saa lisada (välja arvatud null)
    }
    

Zigzag-märgid suurendavad koodi paindlikkust, võimaldades meetoditel töötada laiemate kogumitüüpide spektriga, säilitades samal ajal tüübi turvalisuse. Nende abil saab vältida koodide dubleerimist, mis teevad samu operatsioone erinevate, kuid sarnaste tüüpidega kogumite puhul.