Τι δυνατότητες παρέχουν τα Generics στη Java;
sobes.tech AI
Απάντηση από AI
Τα Γενικά (Generics) στη Java αυξάνουν την ασφάλεια τύπων του κώδικα, αποτρέποντας σφάλματα χρόνου εκτέλεσης που σχετίζονται με την ανακατασκευή τύπων. Βασικές δυνατότητες:
-
Έλεγχος τύπων κατά τη μεταγλώττιση: Ο μεταγλωττιστής ελέγχει τη σωστή χρήση των τύπων που ορίζονται στα Generics, επιτρέποντας την ανίχνευση σφαλμάτων πριν την εκτέλεση του προγράμματος.
// Χωρίς Generics - πιθανή ClassCastException List list = new ArrayList(); list.add("string"); list.add(123); // Προσθήκη Integer String s = (String) list.get(1); // Σφάλμα κατά την εκτέλεση // Με Generics - σφάλμα μεταγλώττισης List<String> stringList = new ArrayList<>(); stringList.add("string"); // stringList.add(123); // Σφάλμα μεταγλώττισης String str = stringList.get(0); // Ασφαλής λήψη -
Απομάκρυνση ανακατασκευής τύπων (type casting): Τα Generics αποφεύγουν την ανάγκη για ρητή ανακατασκευή τύπων κατά την απόκτηση στοιχείων από συλλογές ή τη χρήση παραμετροποιημένων κλάσεων.
// Χωρίς Generics List list = new ArrayList(); list.add("Hello"); String s = (String) list.get(0); // Ρητή ανακατασκευή // Με Generics List<String> stringList = new ArrayList<>(); stringList.add("Hello"); String str = stringList.get(0); // Δεν απαιτείται ανακατασκευή -
Υλοποίηση γενικού κώδικα (Generics Methods, Generics Classes, Generics Interfaces): Επιτρέπουν τη δημιουργία γενικών αλγορίθμων και δομών δεδομένων που λειτουργούν με διάφορους τύπους, χωρίς διπλασιασμό κώδικα.
// Γενικός μέθοδος για εκτύπωση πίνακα public static <T> void printArray(T[] array) { for (T element : array) { System.out.print(element + " "); } System.out.println(); } // Γενική κλάση - ζεύγος τιμών class Pair<K, V> { private K key; private V value; public Pair(K key, V value) { this.key = key; this.value = value; } public K getKey() { return key; } public V getValue() { return value; } } -
Υποστήριξη Wildcards: Επιτρέπουν τον ορισμό ευέλικτων περιορισμών στους τύπους σε παραμετροποιημένους τύπους.
?(Unbounded Wildcard): Οποιοσδήποτε τύπος.? extends T(Bounded Wildcard - Upper Bound): Ο τύπος πρέπει να είναιTή υποτύπος του.? super T(Bounded Wildcard - Lower Bound): Ο τύπος πρέπει να είναιTή υπερτύπος του.
// Μέθοδος που δέχεται λίστα οποιουδήποτε τύπου public static void processList(List<?> list) { // ... } // Μέθοδος που δέχεται λίστα αριθμών ή υποτύπων τους public static void processNumbers(List<? extends Number> list) { // ... } // Μέθοδος που δέχεται λίστα συμβολοσειρών ή υπερτύπων τους public static void addStrings(List<? super String> list) { list.add("νέα συμβολοσειρά"); } -
Χρήση στο Collections Framework: Όλες οι βασικές κλάσεις συλλογών (List, Set, Map κ.ά.) είναι παραμετροποιημένες, καθιστώντας τη δουλειά με συλλογές ασφαλή και εύχρηστη.
Τα Generics αποτελούν βασικό στοιχείο της σύγχρονης Java, αυξάνοντας την αξιοπιστία και την αναγνωσιμότητα του κώδικα.