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
ClassCastExceptionfouten. - Verbeterde leesbaarheid: De code wordt duidelijker doordat het expliciet aangeeft met welke types het werkt.
Voorbeelden:
- De containerklasse
List<T>kan elementen van elk typeTopslaan. - 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, gebruikList<Integer>). - Arrays van generieke types kunnen niet direct worden gemaakt (bijvoorbeeld,
T[] array = new T[10]- onjuist, gebruikArrayListof 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 vanTzijn. Kan elementen van typeTof zijn supertypes lezen, maar niet schrijven (behalvenull).<? super T>: Onderlimiet. Werkt met types die supertypes vanTzijn. Kan elementen van typeTof subtypes schrijven, maar bij lezen alleenObject.
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
}