Middle
Ποιες είναι οι δυνατότητες στα Generics;
sobes.tech AI
Απάντηση από AI
Οι Γενικές (Generics) επιτρέπουν τη δημιουργία παραμετροποιημένων κλάσεων, διεπαφών και μεθόδων.
Βασικές δυνατότητες:
- Επανάχρηση κώδικα: Δημιουργία καθολικών δομών δεδομένων και αλγορίθμων που λειτουργούν με οποιοδήποτε τύπο.
- Ασφάλεια τύπων κατά τη διάρκεια της μεταγλώττισης: Τα σφάλματα τύπων ανιχνεύονται στο στάδιο της μεταγλώττισης, όχι κατά την εκτέλεση. Απαλλάσσει από την ανάγκη χειροκίνητης μετατροπής τύπων και πιθανά σφάλματα
ClassCastException. - Βελτιωμένη αναγνωσιμότητα: Ο κώδικας γίνεται πιο κατανοητός, καθώς δείχνει σαφώς με ποιους τύπους εργάζεται.
Παραδείγματα:
- Η κλάση κοντέινερ
List<T>μπορεί να αποθηκεύει στοιχεία οποιουδήποτε τύπουT. - Η μέθοδος
static <T> T getFirst(List<T> list)μπορεί να επιστρέφει το πρώτο στοιχείο μιας λίστας οποιουδήποτε τύπου.
Περιορισμοί των Generics:
- Δεν είναι δυνατή η δημιουργία στιγμιότυπων γενικών τύπων:
new T(). - Δεν μπορούν να χρησιμοποιηθούν πρωταρχικοί τύποι ως παράμετροι τύπου (π.χ.,
List<int>- λανθασμένο, πρέπει να χρησιμοποιείταιList<Integer>). - Δεν μπορούν να δημιουργηθούν πίνακες γενικών τύπων άμεσα (π.χ.,
T[] array = new T[10]- λανθασμένο, πρέπει να χρησιμοποιείταιArrayListή μετατροπή τύπου). - Δεν μπορούν να χρησιμοποιηθούν στατικά πεδία γενικών τύπων άμεσα.
- Οι πληροφορίες τύπων διαγράφονται κατά την εκτέλεση (Type Erasure), εκτός από περιορισμένους wildcards.
Wildcards και Περιορισμένοι Τύποι Παραμέτρων:
<?>: Άγνωστος τύπος. Επιτρέπει την ανάγνωση στοιχείων, αλλά όχι την εγγραφή.<? extends T>: Άνω όριο. Επιτρέπει την εργασία με τύπους που είναι υποτύποι τουT. Μπορεί να διαβάζει στοιχεία τύπουTή των υπερτύπων του, αλλά όχι να γράφει (εκτός απόnull).<? super T>: Κάτω όριο. Επιτρέπει την εργασία με τύπους που είναι υπέρτυποι τουT. Μπορεί να γράφει στοιχεία τύπουTή των υποτύπων του, αλλά κατά την ανάγνωση λαμβάνει μόνοObject.
Παράδειγμα:
// Μέθοδος που μπορεί να εκτυπώνει στοιχεία από οποιαδήποτε λίστα που περιέχει υποτύπους του Number
public static void printNumbers(List<? extends Number> list) {
for (Number n : list) {
System.out.println(n);
}
// list.add(new Integer(1)); // Σφάλμα μεταγλώττισης
}
// Μέθοδος που μπορεί να προσθέσει Integer σε λίστα
public static void addIntegers(List<? super Integer> list) {
list.add(new Integer(10));
// Integer val = list.get(0); // Σφάλμα μεταγλώττισης, επιστρέφει Object
}