Sobes.tech
Middle

Wat is een wildcard in Java?

sobes.tech AI

Antwoord van AI

Wildcards (?) in Java worden gebruikt in generics om een onbekend type te vertegenwoordigen. Ze maken het mogelijk om te werken met collecties die elementen van verschillende compatibele types bevatten, zonder strikt gebonden te zijn aan een specifiek type.

Belangrijkste gebruiksscenario's:

  1. ? (Upper Bounded Wildcard): Geeft elk type aan dat een subklasse is of een implementatie van de gespecificeerde interface. Wordt gebruikt voor het lezen van gegevens uit een collectie. Voorbeeld: List<? extends Number> kan List<Integer>, List<Double> bevatten, .getList<Long>.

    // Lezen uit een collectie met bovenlimiet
    public void processNumbers(List<? extends Number> numbers) {
        for (Number n : numbers) {
            System.out.println(n);
        }
        // numbers.add(new Integer(10)); // Compileerfout - kan geen elementen toevoegen
    }
    
  2. ? (Lower Bounded Wildcard): Geeft elk type aan dat een superklasse is van de gespecificeerde klasse of interface, of die klasse/interface zelf. Wordt gebruikt voor het schrijven naar een collectie (PECS-principe: Producer Extends, Consumer Super). Voorbeeld: List<? super Integer> kan List<Integer>, List<Number>, List<Object> bevatten.

    // Schrijven naar een collectie met onderlimiet
    public void addIntegers(List<? super Integer> list) {
        list.add(1);
        list.add(new Integer(2));
        // Object o = list.get(0); // Geeft Object terug, omdat het exacte type onbekend is
    }
    
  3. ? (Unbounded Wildcard): Geeft elk type aan. Is gelijk aan ? extends Object. Wordt gebruikt wanneer het exacte type van de elementen in de collectie niet belangrijk is, bijvoorbeeld voor het controleren van de grootte of het legen.

    // Werken met een collectie van elk type
    public void printList(List<?> list) {
        for (Object obj : list) {
            System.out.println(obj);
        }
        // list.add("hello"); // Compileerfout - kan geen elementen toevoegen (behalve null)
    }
    

Wildcards verhogen de flexibiliteit van de code, waardoor methoden kunnen werken met een breder scala aan collectie-typen, terwijl de typeveiligheid behouden blijft. Hiermee kunnen duplicaties in code voor methoden die vergelijkbare operaties uitvoeren op verschillende, maar compatibele collectie-typen, worden voorkomen.