Modulelessen (2/2)
Generieken op Java
Generics (Generic Types) zijn in Java geïntroduceerd om ervoor te zorgen dat klassen, interfaces en methoden op verschillende typen als parameters kunnen werken. Dit garandeert de veiligheid tijdens het compileren en vermijdt dure expliciete casts tijdens runtime.
Generieke klassen
Een generieke klasse wordt gedefinieerd met punthaken <T> waarbij T fungeert als tijdelijke aanduiding voor een type dat wordt gespecificeerd wanneer de klasse wordt geïnstantieerd.
public class Box<T> {
private T content;
public void setContent(T content) {
this.content = content;
}
public T getContent() {
return content;
}
}Bij het maken van een Box object specificeren we het daadwerkelijke type:
Box<Integer> integerBox = new Box<>();
integerBox.setContent(123);
int value = integerBox.getContent(); // No cast needed!Generieke methoden
U kunt één generieke methode definiëren die verschillende typeparameters kan accepteren. De parameter type wordt vóór het retourtype van de methode geplaatst.
public static <E> void printArray(E[] elements) {
for (E element : elements) {
System.out.println(element);
}
}Jokertekens en begrensde typen
We kunnen de door een generiek geaccepteerde typen beperken met behulp van het trefwoord extends (bovengrens) om een specifiek type of zijn subklassen te accepteren.
public static <T extends Number> void processNumber(T number) {
// Accepts Integer, Double, Float, etc.
System.out.println(number.doubleValue());
}Probeer het zelf
Voltooi de generieke klasse Box door de getter getValue() te definiëren die T retourneert en de setter setValue(T value) die de waarde van de privévariabele instelt.
Toon hint
Schrijf de methoden met de juiste handtekening met behulp van de generieke typeparameter `T`.
Oplossing beschikbaar na 3 pogingen
Maak een statische algemene methode printArray die een array van het type T[] met de naam array gebruikt en elk element afdrukt met behulp van een for-each-lus.
Toon hint
De typeparameter `<T>` moet onmiddellijk na `static` en vóór het retourtype `void` worden geplaatst.
Oplossing beschikbaar na 3 pogingen
Maak een statische klasse StringContainer die de Container-interface implementeert die is geparametriseerd met String. Definieer een constructor die een String-parameter nodig heeft en implementeer de getItem() -methode.
Toon hint
Vervang het generieke type `T` door `String` in de klassehandtekening en in het retourtype `getItem()`.
Oplossing beschikbaar na 3 pogingen