Τι είναι το wildcard στη Java;
sobes.tech AI
Απάντηση από AI
Το σύμβολο wildcard (?) στη Java χρησιμοποιείται στα γενικά (generics) για την αναπαράσταση ενός άγνωστου τύπου. Επιτρέπει την εργασία με συλλογές που περιέχουν στοιχεία διαφορετικών συμβατών τύπων, χωρίς να δεσμεύονται αυστηρά σε έναν συγκεκριμένο τύπο.
Οι κύριες περιπτώσεις χρήσης:
-
?(Wildcards με ανώτατο όριο): Αναφέρεται σε οποιονδήποτε τύπο που είναι υποτύπος ή υλοποιεί την καθορισμένη διεπαφή. Χρησιμοποιείται για την ανάγνωση δεδομένων από μια συλλογή. Παράδειγμα:List<? extends Number>μπορεί να περιέχειList<Integer>,List<Double>,.getList<Long>.// Ανάγνωση από συλλογή με ανώτατο όριο public void processNumbers(List<? extends Number> numbers) { for (Number n : numbers) { System.out.println(n); } // numbers.add(new Integer(10)); // Σφάλμα μεταγλώττισης - δεν επιτρέπεται η προσθήκη στοιχείων } -
?(Wildcards με κατώτατο όριο): Αναφέρεται σε οποιονδήποτε τύπο που είναι υπερσύνολο της καθορισμένης κλάσης ή διεπαφής ή η ίδια η κλάση/διεπαφή. Χρησιμοποιείται για την εγγραφή σε μια συλλογή (αρχή PECS: Producer Extends, Consumer Super). Παράδειγμα:List<? super Integer>μπορεί να περιέχειList<Integer>,List<Number>,List<Object>.// Εγγραφή σε συλλογή με κατώτατο όριο public void addIntegers(List<? super Integer> list) { list.add(1); list.add(new Integer(2)); // Object o = list.get(0); // Επιστρέφει Object, καθώς ο ακριβής τύπος είναι άγνωστος } -
?(Unbounded Wildcard): Αναφέρεται σε οποιονδήποτε τύπο. Ισοδυναμεί με? extends Object. Χρησιμοποιείται όταν ο ακριβής τύπος των στοιχείων της συλλογής δεν έχει σημασία, π.χ. για έλεγχο μεγέθους ή εκκαθάριση.// Εργασία με συλλογή οποιουδήποτε τύπου public void printList(List<?> list) { for (Object obj : list) { System.out.println(obj); } // list.add("hello"); // Σφάλμα μεταγλώττισης - δεν επιτρέπεται η προσθήκη στοιχείων (εκτός null) }
Οι wildcards αυξάνουν την ευελιξία του κώδικα, επιτρέποντας σε μεθόδους να εργάζονται με ευρύτερο φάσμα τύπων συλλογών, διατηρώντας την ασφάλεια τύπων. Με τη βοήθειά τους, μπορεί να αποφευχθεί η διπλοτυπία κώδικα για μεθόδους που εκτελούν παρόμοιες λειτουργίες σε διαφορετικούς, αλλά συμβατούς τύπους συλλογών.