java:generics_inheritance

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:generics_inheritance [2015/03/15 21:42]
gthanos
java:generics_inheritance [2015/03/19 15:45]
gthanos
Line 13: Line 13:
 box.boxTest(doubleBox);​ // μπορούμε να γράψουμε?​ box.boxTest(doubleBox);​ // μπορούμε να γράψουμε?​
 </​code>​ </​code>​
-Ο παραπάνω κώδικας είναι σωστός στις γραμμές 3-5 διότι οι κλάσεις ''​Integer''​ και ''​Double''​ είναι υποκλάσεις της κλάσης ''​Number''​. Δεν ισχύει όμως το ίδιο για την γραμμή 8 καθώς η κλάση ''​Box<​Double>''​ **__δεν είναι__** υποκλάση της κλάσης ''​Box<​Number>'',​ όπως δείχνει το παρακάτω σχήμα.+Ο παραπάνω κώδικας είναι σωστός στις γραμμές 3-5 διότι οι κλάσεις ''​Integer''​ και ''​Double''​ είναι υποκλάσεις της κλάσης ''​Number''​. Δεν ισχύει όμως το ίδιο για την γραμμή 8 καθώς η κλάση ''​Box<​Double>''​ **__δεν είναι__** υποκλάση της κλάσης ''​Box<​Number>'',​ όπως δείχνει το παρακάτω σχήμα. ''​Box<​Number>''​ και ''​Box<​Double>''​ είναι υποκλάσεις της κλάσης ''​Object''​.
 {{  :​java:​generics_inheritance1.png?​400 ​ }}  {{  :​java:​generics_inheritance1.png?​400 ​ }} 
  
-Μπορείτε ​να υλοποιήσετε παραμετρικούς τύπους ​δεδομένων που ​κληρονομούν ​από άλλους παραμετρικούς τύπους δεδομένων. ​Για παράδειγμα από την standard βιβλιοθήκη της Java μπορείτε να δείτε ότι ο τύπος ''​ArrayList<​E>''​ υλοποιεί το interface ''​List<​E>''​Το interface ''​List<​E>'' ​με την ​σειρά του επεκτείνει το interface ''​Collection<​E>''​. Έτσι μπορεί να οριστεί η παρακάτω ιεραρχία +<WRAP center round 70% tip> Η έννοια της κληρονομικότητας ​σε αυτή την ​παράγραφο δεν έχει ​την αυστηρή έννοια της ​κληρονομικότητας μεταξύ ​τύπων δεδομένων που ορίσαμε σε προηγούμενες ενότητες. Περισσότερο εστιάζει στο πρακτικό ερώτημα κατά πόσο μπορούμε να χρησιμοποιήσουμε ένα ​τύπο δεδομένων ​στην θέση ενός άλλου τύπου (π.χ. ως όρισμα σε μία μέθοδο). 
-<​code>​ +</​WRAP>​ 
-  Collection<​E> ​                          ​Collection<​String>​ + 
-      |                                          +Οι σχέσεις κληρονομικότητας μεταξύ παραμετρικών ​τύπων μπορούν να οριστούν ως εξήςΑν ένα παραμετρικό interface κληρονομεί ένα ​άλλο παραμετρικό interface τότε μπορούμε ​να πούμε ότι τα δύο interfaces διατηρούν την ​σχέση κληρονομικότητας ΜΟΝΟ αν ο παραμετρικός τύπος που χρησιμοποιούν ​είναι κοινός. Για παράδειγμα, ​η παρακάτω ​παραμετρική σχέση υποδηλώνει κληρονομικότητα ΜΟΝΟ για παραμέτρους ιδίου τύπου 
-      v                                          v +<​code ​java
-    List<​E> ​              π.χ. ​             ​List<​String>​  +  Collection<​E> ​               Collection<​String>                Collection<​Number
-      |                                          | +      |                               ​                               Χ 
-      ​                                         +      v          π.χ. ​                ​           ​όχι όμως και ​       ​
-  ​ArrayList<​E> ​                           ​ArrayList<​String>​+    List<​E> ​                      List<String>                      List<​Integer>
 </​code>​ </​code>​
  
 +Αντίστοιχα,​ αν μία παραμετρική κλάση κληρονομεί μία άλλη παραμετρική κλάση τότε μπορούμε να πούμε ότι οι δύο κλάσεις διατηρούν την σχέση κληρονομικότητας ΜΟΝΟ αν ο παραμετρικός τύπος που χρησιμοποιούν είναι κοινός. Δείτε το παρακάτω παράδειγμα
 +<code java>
 +  HashSet<​E> ​               HashSet<​String> ​                  ​HashSet<​Number>​
 +      |                          |                                  Χ
 +      v          π.χ. ​           v             ​όχι όμως και ​        v
 +LinkedHashSet<​E> ​        ​LinkedHashSet<​String> ​              ​LinkedHashSet<​Integer>​
 +</​code>​
 +
 +Τέλος, αν μία παραμετρική κλάση υλοποιεί ένα παραμετρικό interface τότε μπορούμε να πούμε ότι το interface και η κλάση διατηρούν σχέση κληρονομικότητας ΜΟΝΟ αν ο παραμετρικός τύπος που χρησιμοποιούν είναι κοινός. ​
 +<code java>
 +    List<​E> ​                  ​List<​String> ​                     List<​Number>​
 +      |           ​π.χ. ​            ​| ​          ​όχι όμως και ​        X
 +      v                            v                                V
 +  ArrayList<​E> ​            ​ArrayList<​String> ​                ​ArrayList<​Integer>​
 +</​code>​
  
java/generics_inheritance.txt · Last modified: 2016/02/26 11:15 (external edit)