Middle
Τι είναι τα Generics και για ποιο λόγο χρησιμοποιούνται;
sobes.tech AI
Απάντηση από AI
Τα Generics στη Java επιτρέπουν τη δημιουργία κλάσεων, διεπαφών και μεθόδων που λειτουργούν με παραμετροποιημένους τύπους.
Ο κύριος σκοπός των Generics:
- Αυξημένη ασφάλεια τύπων: Ο μεταγλωττιστής ελέγχει τους τύπους κατά τη φάση της μεταγλώττισης, αποτρέποντας το
ClassCastExceptionκατά την εκτέλεση. - Απαλλαγή από μετατροπές τύπων: Δεν χρειάζεται να μετατρέπετε χειροκίνητα τους τύπους κατά την ανάκτηση στοιχείων από συλλογές.
- Δημιουργία πιο ευέλικτου και επαναχρησιμοποιήσιμου κώδικα: Μπορείτε να γράψετε γενικούς αλγόριθμους και δομές δεδομένων που εφαρμόζονται σε διάφορους τύπους δεδομένων.
Παράδειγμα χωρίς Generics:
// Πριν από το Java 5
import java.util.ArrayList;
import java.util.List;
public class OldStyleList {
public static void main(String[] args) {
List list = new ArrayList(); // χωρίς τύπο
list.add("γεια");
list.add(123); // μπορεί να προστεθεί οποιοδήποτε αντικείμενο
String s = (String) list.get(0); // απαιτείται μετατροπή τύπου
Integer i = (Integer) list.get(1); // απαιτείται μετατροπή τύπου
// Μπορεί να προκύψει σφάλμα μετατροπής
// String error = (String) list.get(1); // ClassCastException
System.out.println(s);
System.out.println(i);
}
}
Παράδειγμα με Generics:
// Με Generics
import java.util.ArrayList;
import java.util.List;
public class GenericList {
public static void main(String[] args) {
List<String> list = new ArrayList<>(); // λίστα συμβολοσειρών
list.add("γεια");
// list.add(123); // σφάλμα μεταγλώττισης - δεν μπορεί να προστεθεί Integer
String s = list.get(0); // χωρίς ανάγκη μετατροπής τύπου
// Δεν είναι δυνατή η προσθήκη άλλου τύπου, αποτρέπει σφάλματα
// List<Integer> intList = new ArrayList<>();
// intList.add("κόσμος"); // σφάλμα μεταγλώττισης
System.out.println(s);
}
}
Τα Generics χρησιμοποιούνται επίσης σε:
- Κλάσεις:
ArrayList<E>,HashMap<K, V> - Διεπαφές:
List<E>,Map<K, V> - Μέθοδοι:
<T> void printArray(T[] array) - Περιορισμοί τύπων:
<T extends Comparable<T>>(περιορισμός σε τύπους που υλοποιούν τοComparable)
Η υλοποίηση των Generics στη Java βασίζεται στην "εξάλειψη τύπων" (type erasure) κατά τη φάση της μεταγλώττισης. Αυτό σημαίνει ότι οι πληροφορίες σχετικά με τους γενικούς τύπους διαγράφονται, και κατά την εκτέλεση η JVM λειτουργεί με ακατέργαστους τύπους. Αυτό διασφαλίζει συμβατότητα με παλαιότερες εκδόσεις της Java, αλλά έχει ορισμένους περιορισμούς.