This shows you the differences between two versions of the page.
Both sides previous revision Previous revision Next revision | Previous revision Next revision Both sides next revision | ||
java:generic_bounded_types [2015/03/19 15:44] gthanos |
java:generic_bounded_types [2015/03/19 16:54] gthanos [Σχέσεις κληρονομικότητας φραγμένων παραμετρικών τύπων δεδομένων] |
||
---|---|---|---|
Line 32: | Line 32: | ||
</code> | </code> | ||
- | Ο παραπάνω κώδικας τυπώνει αντικείμενα από μία λίστα αντικειμένων τύπου ''Οbject''. Λόγω των περιορισμών στην κληρονομικότητα που είδαμε προηγούμενα ο ίδιος κώδικας δεν μπορεί να χρησιμοποιηθεί για να τυπώσει αντικείμενα τύπου ''List<String>'' ή ''List<Integer>''. Κατά συνέπεια | + | Ο παραπάνω κώδικας τυπώνει αντικείμενα από μία λίστα αντικειμένων τύπου ''Οbject''. Λόγω των περιορισμών στην κληρονομικότητα που είδαμε προηγούμενα ο ίδιος κώδικας δεν μπορεί να χρησιμοποιηθεί για να τυπώσει αντικείμενα τύπου ''List<String>'' ή ''List<Integer>'' καθώς δεν μπορούμε να τοποθετήσουμε στην παράμετρο ''List<Object>'' ένα αντικείμενο άλλης κλάσης. Κατά συνέπεια θα χρειαστούμε ένα άλλο τρόπο γραφής της συγκεκριμένης κλάσης, ώστε να απαντά στην γενικότητα. |
Αν θέλουμε να γράψουμε μία αρκετά γενική μέθοδο λίστας που να τυπώνει λίστες οποιουδήποτε αντικειμένου αρκεί να γράψετε το παρακάτω | Αν θέλουμε να γράψουμε μία αρκετά γενική μέθοδο λίστας που να τυπώνει λίστες οποιουδήποτε αντικειμένου αρκεί να γράψετε το παρακάτω | ||
Line 40: | Line 40: | ||
for (Object elem: list) | for (Object elem: list) | ||
System.out.print(elem + " "); | System.out.print(elem + " "); | ||
+ | System.out.println(); | ||
+ | } | ||
+ | </code> | ||
+ | |||
+ | Αντίστοιχα, αν θέλουμε να γράψουμε μία μέθοδο που να τυπώνει μόνο αριθμούς (υποκλάσεις της //abstract// κλάσης ''Number'') τότε αρκεί να γράψουμε το παρακάτω | ||
+ | |||
+ | <code java> | ||
+ | public static void printΝumbers(List<? extends Number> list) { | ||
+ | for (Number num: list) | ||
+ | System.out.print(num + " "); | ||
System.out.println(); | System.out.println(); | ||
} | } | ||
Line 49: | Line 59: | ||
{{ :java:generics_inheritance3.png?500 |}} | {{ :java:generics_inheritance3.png?500 |}} | ||
+ | Γενικότερα, σχέσεις κληρονομικότητας μεταξύ φραγμένων τύπων ισχύουν με κριτήρια κατά πόσο μπορούμε να αντικαταστήσουμε ένα τύπο δεδομένων με έναν άλλο τύπο δεδομένων. Δείτε τα παρακάτω παραδείγματα κληρονομικότητας | ||
+ | <code java> | ||
+ | List<?> | ||
+ | | | ||
+ | v | ||
+ | List<? extends Number> | ||
+ | | | ||
+ | v | ||
+ | List<? extends Integer> | ||
+ | | | ||
+ | v | ||
+ | List<Integer> | ||
+ | </code> | ||
- | Γενικότερα προκειμένου να δημιουργήσουμε σχέσεις κληρονομικότητας μεταξύ παραμετρικών τύπων δεδομένων, ο μόνος τρόπος για να το κάνουμε είναι να χρησιμοποιήσουμε φραγμένους παραμετρικούς τύπους, όπως παρακάτω | + | Αντίστοιχα ισχύουν |
+ | <code java> | ||
+ | List<?> | ||
+ | | | ||
+ | v | ||
+ | List<? super Integer> | ||
+ | | | ||
+ | v | ||
+ | List<? super Number> | ||
+ | | | ||
+ | v | ||
+ | List<Number> | ||
+ | </code> | ||
+ | |||
+ | Ανάλογα ισχύουν και τα παρακάτω | ||
+ | <code java> | ||
+ | List<? extends Number> List<? super Integer> | ||
+ | | και | | ||
+ | ------------------------------------ ------------------------------------ | ||
+ | | | | | | ||
+ | v v v v | ||
+ | List<Number> List<Integer> List<Number> List<Integer> | ||
+ | </code> | ||
+ | |||
+ | Δοκιμάστε να μεταγλωττίσετε τα παρακάτω παραδείγματα κώδικα για να επιβεβαιώσετε τα παραπάνω. | ||
+ | <code java> | ||
+ | List<? extends Νumber> numList = new ArrayList<>(); | ||
+ | List<?> objectList = numList; | ||
+ | </code> | ||
<code java> | <code java> | ||
List<? extends Integer> intList = new ArrayList<>(); | List<? extends Integer> intList = new ArrayList<>(); | ||
- | List<? extends Number> numList = intList; // OK. List<? extends Integer> is a subtype of List<? extends Number> | + | List<? extends Number> numList = intList; |
</code> | </code> | ||
+ | <code java> | ||
+ | List<Integer> intList = new ArrayList<>(); | ||
+ | List<? extends Integer> extendedIntList = intList; | ||
+ | </code> | ||
+ | |||
+ | Ανάλογα | ||
+ | <code java> | ||
+ | List<? super Integer> intList = new ArrayList<>(); | ||
+ | List<?> objectList = intList; | ||
+ | </code> | ||
+ | <code java> | ||
+ | List<? super Number> numList = new ArrayList<>(); | ||
+ | List<? super Integer> inList = numList; | ||
+ | </code> | ||
+ | <code java> | ||
+ | List<Number> numList = new ArrayList<>(); | ||
+ | List<? super Number> extendedIntList = intList; | ||
+ | </code> | ||
+ | |||
+ | |||
Το παρακάτω σχήμα εξηγεί τις σχέσεις κληρονομικότητας που διέπουν (άνω και κάτω) φραγμένους τύπους δεδομένων (Λίστες). | Το παρακάτω σχήμα εξηγεί τις σχέσεις κληρονομικότητας που διέπουν (άνω και κάτω) φραγμένους τύπους δεδομένων (Λίστες). |