Sobes.tech
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
}