Java Diamond Operator:vereenvoudig generieken in Java 7+
Java Diamond-operator
De diamantoperator werd geïntroduceerd in Java 7 om code leesbaarder te maken voor generieke programma's. Een generiek is een soort argument. Met behulp van generiek kunnen we elk soort object doorgeven dat door de klassenmethoden moet worden verwerkt. Als we bijvoorbeeld vóór Java 7 een lijst met tekenreeksen maken, moeten we de volgende syntaxis gebruiken om een lijst met tekenreeksen te instantiëren met een ArrayList-object.
List<String> listOfStrings = new ArrayList<String>();
Vanaf Java 7 kunnen we de diamantoperator gebruiken om de bovenstaande syntaxis als volgt te vereenvoudigen −
List<String> listOfStrings = new ArrayList<>();
Maar het kon niet worden gebruikt met anonieme innerlijke klassen. We kunnen bijvoorbeeld het objecttype van de diamantoperator in de onderstaande syntaxis vóór Java 9 niet weglaten.
Handler<Integer> intHandler = new Handler<Integer>(1) {
@Override
public void handle() {
System.out.println(content);
}
};
Diamantoperator in anonieme klasse
In Java 9 kan de diamantoperator ook worden gebruikt met een anonieme klasse om de code te vereenvoudigen en de leesbaarheid te verbeteren.
Handler<Integer> intHandler = new Handler<>(1) {
@Override
public void handle() {
System.out.println(content);
}
};
Diamantoperator in Java 7, Java 8
In het onderstaande voorbeeld hebben we anonieme klassen gemaakt voor een abstracte klassehandler die een generiek argument accepteert en het objecttype doorgeeft terwijl we de anonieme klasse maken, omdat we het typeargument moeten doorgeven, anders kan het programma niet compileren.
Voorbeeld
public class Tester {
public static void main(String[] args) {
// create an Anonymous class to handle 1
// Here we need to pass Type arguments in diamond operator
// before Java 9 otherwise compiler will complain error
Handler<Integer> intHandler = new Handler<Integer>(1) {
@Override
public void handle() {
System.out.println(content);
}
};
intHandler.handle();
// create an Anonymous class to handle 2
Handler<? extends Number> intHandler1 = new Handler<Number>(2) {
@Override
public void handle() {
System.out.println(content);
}
};
intHandler1.handle();
Handler<?> handler = new Handler<Object>("test") {
@Override
public void handle() {
System.out.println(content);
}
};
handler.handle();
}
}
abstract class Handler<T> {
public T content;
public Handler(T content) {
this.content = content;
}
abstract void handle();
}
Uitvoer
Laten we het bovenstaande programma compileren en uitvoeren, dit zal het volgende resultaat opleveren −
1 2 Test
Diamond Operator Java 9 en hoger
Met Java 9 kunnen we de operator <> gebruiken met een anonieme klasse, zoals hieronder weergegeven.
Voorbeeld
In het onderstaande voorbeeld hebben we anonieme klassen gemaakt voor een abstracte klassehandler die een generiek argument accepteert, maar zonder het objecttype, terwijl we de anonieme klasse maken, omdat we het typeargument niet hoeven door te geven. Compiler leidt het type zelf af.
public class Tester {
public static void main(String[] args) {
// create an Anonymous class to handle 1
// Here we do not need to pass Type arguments in diamond operator
// as Java 9 compiler can infer the type automatically
Handler<Integer> intHandler = new Handler<>(1) {
@Override
public void handle() {
System.out.println(content);
}
};
intHandler.handle();
Handler<? extends Number> intHandler1 = new Handler<>(2) {
@Override
public void handle() {
System.out.println(content);
}
};
intHandler1.handle();
Handler<?> handler = new Handler<>("test") {
@Override
public void handle() {
System.out.println(content);
}
};
handler.handle();
}
}
abstract class Handler<T> {
public T content;
public Handler(T content) {
this.content = content;
}
abstract void handle();
}
Uitvoer
Laten we het bovenstaande programma compileren en uitvoeren, dit zal het volgende resultaat opleveren −
1 2 Test
Java
- Java-vector
- Zelfstudie Java-arrays:declareren, maken, initialiseren [voorbeeld]
- Java FileOutputStream-klasse
- Java - Uitzonderingen
- Java enum Strings
- Java-schrijversklasse
- Java String toLowercase() en toUpperCase() methoden
- Java 10 - Geconsolideerd JDK-forest
- Java TreeSet
- Multithreading in Java-zelfstudie met programma en voorbeelden
- Hoe een array van objecten in Java te maken