User Tools

Site Tools


java:generic_bounded_types

Differences

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

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
java:generic_bounded_types [2015/03/19 16:54] – [Σχέσεις κληρονομικότητας φραγμένων παραμετρικών τύπων δεδομένων] gthanosjava:generic_bounded_types [2020/03/11 07:40] (current) – external edit 127.0.0.1
Line 1: Line 1:
-====== Φραγμένοι παραμετρικοί τύπων δεδομένων ======+====== Φραγμένοι παραμετρικοί τύποι δεδομένων ====== 
 + 
 +Παρακάτω αναλύονται 3 υποκατηγορίες παραμετρικών τύπων δεδομένων 
 +  * οι άνω φραγμένοι παραμετρικοί τύποι 
 +  * οι κάτω φραγμένοι και  
 +  * οι μη φραγμένοι
  
 ===== Άνω φραγμένοι παραμετρικοί τύποι (Upper Bounded Wildcards) ===== ===== Άνω φραγμένοι παραμετρικοί τύποι (Upper Bounded Wildcards) =====
  
 <code java> <code java>
-public static void process(List<? extends Number> list) { /* ... */ }+public static void process(List<? extends Number> list) { /*   */ }
 </code> </code>
  
-Στην παραπάνω δήλωση ο τύπος δεδομένων της παραμετρικής κλάσης ''List'' μπορεί να είναι η κλάση ''Number'' η οποιαδήποτε υποκλάση της ''Number'' (π.χ ''Integer'', ''Double'', ''Float'').+Στην παραπάνω δήλωση ο τύπος δεδομένων της παραμετρικής κλάσης ''java.util.List'' μπορεί να είναι η κλάση ''java.lang.Number'' η οποιαδήποτε υποκλάση της ''java.lang.Number'' (π.χ ''Integer'', ''Double'', ''Float''). Ο παραπάνω τύπος είναι φραγμένος προς τα πάνω.
  
 ===== Κάτω φραγμένοι παραμετρικοί τύποι (Lower Bounded Wildcards) ===== ===== Κάτω φραγμένοι παραμετρικοί τύποι (Lower Bounded Wildcards) =====
Line 19: Line 24:
 </code> </code>
  
-Στην παραπάνω δήλωση ο τύπος δεδομένων της παραμετρικής κλάσης ''List'' μπορεί να είναι η κλάση ''Integer'' ή οποιαδήποτε υπερ-κλάση της ''Integer'' (π.χ ''Number'').+Στην παραπάνω δήλωση ο τύπος δεδομένων της παραμετρικής κλάσης ''java.util.List'' μπορεί να είναι η κλάση ''java.lang.Integer'' ή οποιαδήποτε υπερ-κλάση της ''java.lang.Integer'' (π.χ ''java.lang.Object''). 
  
 ===== Μη φραγμένοι παραμετρικοί τύποι (Unbounded Wildcards) ===== ===== Μη φραγμένοι παραμετρικοί τύποι (Unbounded Wildcards) =====
  
-Ας εξετάσουμε τους μη φραγμένους παραμετρικούς τύπους μέσα το παρακάτω παράδειγμα.+Θα εξετάσουμε τους μη φραγμένους παραμετρικούς τύπους μέσα το παρακάτω παράδειγμα.
 <code java> <code java>
 public static void printList(List<Object> list) { public static void printList(List<Object> list) {
Line 32: Line 38:
 </code> </code>
  
-Ο παραπάνω κώδικας τυπώνει αντικείμενα από μία λίστα αντικειμένων τύπου ''Οbject''. Λόγω των περιορισμών στην κληρονομικότητα που είδαμε προηγούμενα ο ίδιος κώδικας δεν μπορεί να χρησιμοποιηθεί για να τυπώσει αντικείμενα τύπου ''List<String>'' ή ''List<Integer>'' καθώς δεν μπορούμε να τοποθετήσουμε στην παράμετρο ''List<Object>'' ένα αντικείμενο άλλης κλάσης. Κατά συνέπεια θα χρειαστούμε ένα άλλο τρόπο γραφής της συγκεκριμένης κλάσης, ώστε να απαντά στην γενικότητα.+Ο παραπάνω κώδικας τυπώνει αντικείμενα από μία λίστα αντικειμένων τύπου ''Οbject''. Λόγω των περιορισμών στην κληρονομικότητα που είδαμε προηγούμενα ο ίδιος κώδικας δεν μπορεί να χρησιμοποιηθεί για να τυπώσει αντικείμενα τύπου ''List<String>'' ή ''List<Integer>'' καθώς δεν μπορούμε να τοποθετήσουμε στην παράμετρο ''List<Object>'' ένα αντικείμενο άλλης κλάσης. Κατά συνέπεια θα χρειαστούμε ένα άλλο τρόπο γραφής της συγκεκριμένης κλάσης, ώστε να εκπληρώνει τη ζητούμενη γενικότητα.
  
-Αν θέλουμε να γράψουμε μία αρκετά γενική μέθοδο λίστας που να τυπώνει λίστες οποιουδήποτε αντικειμένου αρκεί να γράψετε το παρακάτω+Αν θέλουμε να γράψουμε μία αρκετά γενική μέθοδο λίστας που να τυπώνει λίστες οποιουδήποτε αντικειμένου αρκεί να γράψουμε το παρακάτω
  
 <code java> <code java>
Line 44: Line 50:
 </code> </code>
  
-Αντίστοιχααν θέλουμε να γράψουμε μία μέθοδο που να τυπώνει μόνο αριθμούς (υποκλάσεις της //abstract// κλάσης ''Number'') τότε αρκεί να γράψουμε το παρακάτω+Σε αναλογία με το παραπάνω, εάν θέλουμε να γράψουμε μία μέθοδο που να τυπώνει μόνο αριθμούς, αλλά όχι String (δηλαδή υποκλάσεις της //abstract// κλάσης ''Number'') τότε αρκεί να γράψουμε το παρακάτω:
  
 <code java> <code java>
Line 54: Line 60:
 </code> </code>
  
-===== Σχέσεις κληρονομικότητας φραγμένων παραμετρικών τύπων δεδομένων ===== +|Προηγούμενο: [[:java:generics_inheritance | Κληρονομικότητα Παραμετρικών Τύπων  ]] | [[:toc | Περιεχόμενα ]] | Επόμενο: [[:java:generic_bounded_types_inheritance Σχέσεις κληρονομικότητας φραγμένων παραμετρικών τύπων δεδομένων  ]]|
- +
-Όπως είδαμε οι τύποι ''List<Integer>'' και ''List<String>'' δεν διέπονται από καμία σχέση κληρονομικότητας. Ο κοινός πατέρας και τον δύο λιστών είναι η κλάση ''List<?>'', όπως φαίνεται παρακάτω +
-{{ :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 +
-   List<Number>                     List<Integer>           List<Number>                     List<Integer> +
-</code> +
- +
-Δοκιμάστε να μεταγλωττίσετε τα παρακάτω παραδείγματα κώδικα για να επιβεβαιώσετε τα παραπάνω. +
-<code java> +
-List<? extends Νumber> numList = new ArrayList<>(); +
-List<?>  objectList = numList;   +
-</code> +
-<code java> +
-List<? extends Integer> intList = new ArrayList<>(); +
-List<? extends Number>  numList = intList;   +
-</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?500 |}} +
  
  
  
java/generic_bounded_types.1426784083.txt.gz · Last modified: 2015/03/19 16:54 (external edit)