java:generic_bounded_types

This is an old revision of the document!


Φραγμένοι παραμετρικοί τύπων δεδομένων

Άνω φραγμένοι παραμετρικοί τύποι (Upper Bounded Wildcards)

public static void process(List<? extends Number> list) { /* ... */ }

Στην παραπάνω δήλωση ο τύπος δεδομένων της παραμετρικής κλάσης List μπορεί να είναι η κλάση Number η οποιαδήποτε υποκλάση της Number (π.χ Integer, Double, Float).

Κάτω φραγμένοι παραμετρικοί τύποι (Lower Bounded Wildcards)

public static void addNumbers(List<? super Integer> list) {
    for (int i = 1; i <= 10; i++) {
        list.add(i);
    }
}

Στην παραπάνω δήλωση ο τύπος δεδομένων της παραμετρικής κλάσης List μπορεί να είναι η κλάση Integer ή οποιαδήποτε υπερ-κλάση της Integer (π.χ Number).

Μη φραγμένοι παραμετρικοί τύποι (Unbounded Wildcards)

Ας εξετάσουμε τους μη φραγμένους παραμετρικούς τύπους μέσα το παρακάτω παράδειγμα.

public static void printList(List<Object> list) {
    for (Object elem : list)
        System.out.println(elem + " ");
    System.out.println();
}

Ο παραπάνω κώδικας τυπώνει αντικείμενα από μία λίστα αντικειμένων τύπου Οbject. Λόγω των περιορισμών στην κληρονομικότητα που είδαμε προηγούμενα ο ίδιος κώδικας δεν μπορεί να χρησιμοποιηθεί για να τυπώσει αντικείμενα τύπου List<String> ή List<Integer>. Κατά συνέπεια

Αν θέλουμε να γράψουμε μία αρκετά γενική μέθοδο λίστας που να τυπώνει λίστες οποιουδήποτε αντικειμένου αρκεί να γράψετε το παρακάτω

public static void printList(List<?> list) {
    for (Object elem: list)
        System.out.print(elem + " ");
    System.out.println();
}

Σχέσεις κληρονομικότητας φραγμένων παραμετρικών τύπων δεδομένων

Όπως είδαμε οι τύποι List<Integer> και List<String> δεν διέπονται από καμία σχέση κληρονομικότητας. Ο κοινός πατέρας και τον δύο λιστών είναι η κλάση List<?>, όπως φαίνεται παρακάτω

Γενικότερα προκειμένου να δημιουργήσουμε σχέσεις κληρονομικότητας μεταξύ παραμετρικών τύπων δεδομένων, ο μόνος τρόπος για να το κάνουμε είναι να χρησιμοποιήσουμε φραγμένους παραμετρικούς τύπους, όπως παρακάτω

List<? extends Integer> intList = new ArrayList<>();
List<? extends Number>  numList = intList;  // OK. List<? extends Integer> is a subtype of List<? extends Number>

Το παρακάτω σχήμα εξηγεί τις σχέσεις κληρονομικότητας που διέπουν (άνω και κάτω) φραγμένους τύπους δεδομένων (Λίστες).

java/generic_bounded_types.1426779896.txt.gz · Last modified: 2015/03/19 15:44 by gthanos