Sobes.tech
Middle

Mi az a wildcard Java-ban?

sobes.tech MI

Válasz az MI-től

A ? helyettesítő karaktert a Java generikus típusokban használják ismeretlen típus reprezentálására. Lehetővé teszi, hogy különböző kompatibilis típusú elemeket tartalmazó gyűjteményekkel dolgozzunk anélkül, hogy szigorúan egy adott típushoz kötődnének.

Fő felhasználási forgatókönyvek:

  1. ? (Felső korlátos joker): Bármilyen olyan típusra utal, amely egy alosztály vagy az adott interfészt megvalósító típus. Adatok olvasására használják gyűjteményből. Példa: List<? extends Number> tartalmazhat List<Integer>, List<Double> típusokat, .getList<Long>.

    // Olvasás felső korláttal
    public void processNumbers(List<? extends Number> numbers) {
        for (Number n : numbers) {
            System.out.println(n);
        }
        // numbers.add(new Integer(10)); // Fordítási hiba - nem lehet elemeket hozzáadni
    }
    
  2. ? (Alsó korlátos joker): Bármilyen olyan típusra utal, amely egy szuperosztálya vagy az adott osztálynak/interfésznek, vagy maga az osztály/interfész. Írásra használják gyűjteménybe (PECS elv: Producer Extends, Consumer Super). Példa: List<? super Integer> tartalmazhat List<Integer>, List<Number>, List<Object> típusokat.

    // Írás alsó korláttal
    public void addIntegers(List<? super Integer> list) {
        list.add(1);
        list.add(new Integer(2));
        // Object o = list.get(0); // Object-et ad vissza, mivel a pontos típus ismeretlen
    }
    
  3. ? (Korlátlan joker): Bármilyen típusra utal. Egyenértékű a ? extends Object-tel. Akkor használják, amikor nem fontos a gyűjtemény elemeinek tényleges típusa, például méret ellenőrzésére vagy törlésére.

    // Bármilyen típusú gyűjteménnyel való munka
    public void printList(List<?> list) {
        for (Object obj : list) {
            System.out.println(obj);
        }
        // list.add("hello"); // Fordítási hiba - nem lehet elemeket hozzáadni (kivéve null)
    }
    

A wildcards növelik a kód rugalmasságát, lehetővé téve, hogy a metódusok szélesebb típusú gyűjteményekkel dolgozzanak, miközben megőrzik a típusbiztonságot. Segítségükkel elkerülhető a kód duplikálása olyan metódusok esetében, amelyek hasonló műveleteket végeznek különböző, de kompatibilis gyűjteménytípusokon.