Sobes.tech
Middle

Wat zijn Generics en waar worden ze voor gebruikt?

sobes.tech AI

Antwoord van AI

Generics in Java maken het mogelijk om klassen, interfaces en methoden te maken die werken met getypeerde parameters.

Het belangrijkste doel van Generics:

  • Verbetering van typeveiligheid: De compiler controleert de types tijdens het compileren, waardoor ClassCastException tijdens runtime wordt voorkomen.
  • Verwijdering van typeconversies: Het is niet nodig om types handmatig te casten bij het ophalen van elementen uit collecties.
  • Creëren van flexibelere en herbruikbare code: Je kunt generieke algoritmen en datastructuren schrijven die toepasbaar zijn op verschillende datatypes.

Voorbeeld zonder Generics:

// Voor Java 5
import java.util.ArrayList;
import java.util.List;

public class OldStyleList {
    public static void main(String[] args) {
        List list = new ArrayList(); // zonder typeaanduiding
        list.add("hallo");
        list.add(123); // kan elk object toevoegen

        String s = (String) list.get(0); // casten is nodig
        Integer i = (Integer) list.get(1); // casten is nodig

        // Kan leiden tot runtime fouten
        // String error = (String) list.get(1); // ClassCastException
        System.out.println(s);
        System.out.println(i);
    }
}

Voorbeeld met Generics:

// Met Generics
import java.util.ArrayList;
import java.util.List;

public class GenericList {
    public static void main(String[] args) {
        List<String> list = new ArrayList<>(); // lijst van strings
        list.add("hallo");
        // list.add(123); // compileerfout - kan geen Integer toevoegen

        String s = list.get(0); // geen cast nodig

        // Het is niet mogelijk om een ander type toe te voegen, voorkomt fouten
        // List<Integer> intList = new ArrayList<>();
        // intList.add("wereld"); // compileerfout
        System.out.println(s);
    }
}

Generics worden ook gebruikt in:

  • Klassen: ArrayList<E>, HashMap<K, V>
  • Interfaces: List<E>, Map<K, V>
  • Methoden: <T> void printArray(T[] array)
  • Typebeperkingen: <T extends Comparable<T>> (beperking tot types die Comparable implementeren)

De implementatie van Generics in Java is gebaseerd op "type erasure" (type-verdwijning) tijdens het compilatieproces. Dit betekent dat informatie over de generieke types wordt verwijderd, en dat de JVM tijdens runtime werkt met raw types. Dit garandeert compatibiliteit met oudere Java-versies, maar heeft enkele beperkingen.