java:generic_bounded_types

This is an old revision of the document!


A PCRE internal error occured. This might be caused by a faulty plugin

====== Φραγμένοι παραμετρικοί τύπων δεδομένων ====== ===== Upper Bounded Wildcards ===== <code java> public static void process(List<? extends Number> list) { /* ... */ } </code> Στην παραπάνω δήλωση ο τύπος δεδομένων της παραμετρικής κλάσης ''List'' μπορεί να είναι η κλάση ''Number'' η οποιαδήποτε υποκλάση της ''Number'' (π.χ ''Integer'', ''Double''). ===== Lower Bounded Wildcards ===== <code java> public static void addNumbers(List<? super Integer> list) { for (int i = 1; i <= 10; i++) { list.add(i); } } </code> Στην παραπάνω δήλωση ο τύπος δεδομένων της παραμετρικής κλάσης ''List'' μπορεί να είναι η κλάση ''Integer'' η οποιαδήποτε υπερ-κλάση της ''Integer'' (π.χ ''Number''). ===== Unbounded Wildcards ===== <code java> public static void printList(List<Object> list) { for (Object elem : list) System.out.println(elem + " "); System.out.println(); } </code> Ο παραπάνω κώδικας τυπώνει αντικείμενα από μία λίστα αντικειμένων τύπου ''Οbject''. Λόγω των περιορισμών στην κληρονομικότητα που είδαμε προηγούμενα ο ίδιος κώδικας δεν μπορεί να χρησιμοποιηθεί για να τυπώσει αντικείμενα τύπου ''List<String>'' ή ''List<Integer>''. Αν θέλουμε να γράψουμε μία αρκετά γενική μέθοδο λίστας που να τυπώνει λίστες οποιουδήποτε αντικειμένου αρκεί να γράψετε το παρακάτω <code java> public static void printList(List<?> list) { for (Object elem: list) System.out.print(elem + " "); System.out.println(); } </code> ===== Σχέσεις κληρονομικότητας φραγμένων παραμετρικών τύπων δεδομένων ===== Όπως είδαμε οι τύποι ''List<Integer>'' και ''List<String>'' δεν διέπονται από καμία σχέση κληρονομικότητας. Ο κοινός πατέρας και τον δύο λιστών είναι η κλάση ''List<?>'', όπως φαίνεται παρακάτω {{ :java:generics_inheritance3.png?300 |}} Γενικότερα προκειμένου να δημιουργήσουμε σχέσεις κληρονομικότητας μεταξύ παραμετρικών τύπων δεδομένων, ο μόνος τρόπος για να το κάνουμε είναι να χρησιμοποιήσουμε φραγμένους παραμετρικούς τύπους, όπως παρακάτω <code java> List<? extends Integer> intList = new ArrayList<>(); List<? extends Number> numList = intList; // OK. List<? extends Integer> is a subtype of List<? extends Number> </code> Το παρακάτω σχήμα εξηγεί τις σχέσεις κληρονομικότητας που διέπουν (άνω και κάτω) φραγμένους τύπους δεδομένων (Λίστες). {{ :java:generics_inheritance4.png?300 |}}

java/generic_bounded_types.1426455676.txt.gz · Last modified: 2016/02/26 11:15 (external edit)