Sobes.tech
Middle

Wat zijn de mogelijkheden in Generics?

sobes.tech AI

Antwoord van AI

Generics maken het mogelijk om parametriseerde klassen, interfaces en methoden te creëren.

Belangrijkste functies:

  • Herbruikbaarheid van code: Het maken van universele datastructuren en algoritmen die met elk type werken.
  • Typeveiligheid tijdens compilatie: Typefouten worden gedetecteerd tijdens compilatie, niet tijdens uitvoering. Verwijdert de noodzaak voor handmatige typeconversies en potentiële ClassCastException fouten.
  • Verbeterde leesbaarheid: De code wordt duidelijker doordat het expliciet aangeeft met welke types het werkt.

Voorbeelden:

  • De containerklasse List<T> kan elementen van elk type T opslaan.
  • De methode static <T> T getFirst(List<T> list) kan het eerste element van een lijst van elk type teruggeven.

Beperkingen van Generics:

  • Het is niet mogelijk om instanties van generieke types te maken: new T().
  • Primitieve types kunnen niet als type-parameters worden gebruikt (bijvoorbeeld, List<int> - onjuist, gebruik List<Integer>).
  • Arrays van generieke types kunnen niet direct worden gemaakt (bijvoorbeeld, T[] array = new T[10] - onjuist, gebruik ArrayList of casten).
  • Statische velden van generieke types kunnen niet direct worden gebruikt.
  • Type-informatie wordt tijdens runtime verwijderd (Type Erasure), behalve voor bounded wildcards.

Wildcards en begrensde Type Parameters:

  • <?>: Onbekend type. Staat lezen toe, schrijven niet.
  • <? extends T>: Bovenlimiet. Werkt met types die subtypes van T zijn. Kan elementen van type T of zijn supertypes lezen, maar niet schrijven (behalve null).
  • <? super T>: Onderlimiet. Werkt met types die supertypes van T zijn. Kan elementen van type T of subtypes schrijven, maar bij lezen alleen Object.

Voorbeeld:

// Methode die elementen uit elke lijst met subtypes van Number kan afdrukken
public static void printNumbers(List<? extends Number> list) {
    for (Number n : list) {
        System.out.println(n);
    }
    // list.add(new Integer(1)); // Compileerfout
}

// Methode die Integer kan toevoegen aan een lijst
public static void addIntegers(List<? super Integer> list) {
    list.add(new Integer(10));
    // Integer val = list.get(0); // Compileerfout, retourneert Object
}