java:generic_bounded_types

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
java:generic_bounded_types [2015/03/15 21:41]
gthanos
java:generic_bounded_types [2016/02/26 11:15] (current)
Line 1: Line 1:
 ====== Φραγμένοι παραμετρικοί τύπων δεδομένων ====== ====== Φραγμένοι παραμετρικοί τύπων δεδομένων ======
  
-===== Upper Bounded Wildcards =====+===== Άνω φραγμένοι παραμετρικοί τύποι (Upper Bounded Wildcards=====
  
 <code java> <code java>
Line 7: Line 7:
 </​code>​ </​code>​
  
-Στην παραπάνω δήλωση ο τύπος δεδομένων της παραμετρικής κλάσης ''​List''​ μπορεί να είναι η κλάση ''​Number''​ η οποιαδήποτε υποκλάση της ''​Number''​ (π.χ ''​Integer'',​ ''​Double''​).+Στην παραπάνω δήλωση ο τύπος δεδομένων της παραμετρικής κλάσης ''​List''​ μπορεί να είναι η κλάση ''​Number''​ η οποιαδήποτε υποκλάση της ''​Number''​ (π.χ ''​Integer'',​ ''​Double'',​ ''​Float''​).
  
-===== Lower Bounded Wildcards =====+===== Κάτω φραγμένοι παραμετρικοί τύποι (Lower Bounded Wildcards=====
  
 <code java> <code java>
Line 19: Line 19:
 </​code>​ </​code>​
  
-Στην παραπάνω δήλωση ο τύπος δεδομένων της παραμετρικής κλάσης ''​List''​ μπορεί να είναι η κλάση ''​Integer'' ​η οποιαδήποτε υπερ-κλάση της ''​Integer''​ (π.χ ''​Number''​).+Στην παραπάνω δήλωση ο τύπος δεδομένων της παραμετρικής κλάσης ''​List''​ μπορεί να είναι η κλάση ''​Integer'' ​ή οποιαδήποτε υπερ-κλάση της ''​Integer''​ (π.χ ''​Number''​).
  
-===== Unbounded Wildcards =====+===== Μη φραγμένοι παραμετρικοί τύποι (Unbounded Wildcards=====
  
 +Ας εξετάσουμε τους μη φραγμένους παραμετρικούς τύπους μέσα το παρακάτω παράδειγμα.
 <code java> <code java>
 public static void printList(List<​Object>​ list) { public static void printList(List<​Object>​ list) {
Line 30: Line 31:
 } }
 </​code>​ </​code>​
-Ο παραπάνω κώδικας τυπώνει αντικείμενα από μία λίστα αντικειμένων τύπου ''​Οbject''​. Λόγω των περιορισμών στην κληρονομικότητα που είδαμε προηγούμενα ο ίδιος κώδικας δεν μπορεί να χρησιμοποιηθεί για να τυπώσει αντικείμενα τύπου ''​List<​String>''​ ή ''​List<​Integer>''​. Αν θέλουμε να γράψουμε μία αρκετά γενική μέθοδο λίστας που να τυπώνει λίστες οποιουδήποτε αντικειμένου αρκεί να γράψετε το παρακάτω+ 
 +Ο παραπάνω κώδικας τυπώνει αντικείμενα από μία λίστα αντικειμένων τύπου ''​Οbject''​. Λόγω των περιορισμών στην κληρονομικότητα που είδαμε προηγούμενα ο ίδιος κώδικας δεν μπορεί να χρησιμοποιηθεί για να τυπώσει αντικείμενα τύπου ''​List<​String>''​ ή ''​List<​Integer>'' ​καθώς δεν μπορούμε να τοποθετήσουμε στην παράμετρο ''​List<​Object>''​ ένα αντικείμενο άλλης κλάσης. Κατά συνέπεια θα χρειαστούμε ένα άλλο τρόπο γραφής της συγκεκριμένης κλάσης,​ ώστε να απαντά στην γενικότητα. 
 + 
 +Αν θέλουμε να γράψουμε μία αρκετά γενική μέθοδο λίστας που να τυπώνει λίστες οποιουδήποτε αντικειμένου αρκεί να γράψετε το παρακάτω
  
 <code java> <code java>
Line 36: 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 43: Line 57:
  
 Όπως είδαμε οι τύποι ''​List<​Integer>''​ και ''​List<​String>''​ δεν διέπονται από καμία σχέση κληρονομικότητας. Ο κοινός πατέρας και τον δύο λιστών είναι η κλάση ''​List<?>'',​ όπως φαίνεται παρακάτω Όπως είδαμε οι τύποι ''​List<​Integer>''​ και ''​List<​String>''​ δεν διέπονται από καμία σχέση κληρονομικότητας. Ο κοινός πατέρας και τον δύο λιστών είναι η κλάση ''​List<?>'',​ όπως φαίνεται παρακάτω
-{{ :​java:​generics_inheritance3.png?​300 |}}+{{ :​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> extendedNumList = numList; ​
 +</​code>​
 +
 +
  
-Το παρακάτω σχήμα εξηγεί τις σχέσεις κληρονομικότητας που διέπουν (άνω και κάτω) φραγμένους τύπους δεδομένων ​ίστες)+Το παρακάτω σχήμα εξηγεί τις σχέσεις κληρονομικότητας που διέπουν (άνω και κάτω) φραγμένους τύπους δεδομένων ​για τον παραμετρικό τύπο δεδομένων της λίστας. 
-{{ :​java:​generics_inheritance4.png?​300 |}}+{{ :​java:​generics_inheritance4.png?​500 |}}
  
  
  
  
java/generic_bounded_types.1426455676.txt.gz · Last modified: 2016/02/26 11:15 (external edit)