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
Next revision Both sides next revision
java:generics_inheritance [2015/03/15 21:42]
gthanos
java:generics_inheritance [2015/03/19 15:35]
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 ​ }} 
 +
 +<WRAP center round 70% tip> Η έννοια της κληρονομικότητας σε αυτή την παράγραφο δεν έχει την αυστηρή έννοια της κληρονομικότητας μεταξύ τύπων δεδομένων που ορίσαμε σε προηγούμενες ενότητες. Περισσότερο εστιάζει στο πρακτικό ερώτημα κατά πόσο μπορούμε να χρησιμοποιήσουμε ένα τύπο δεδομένων στην θέση ενός άλλου τύπου (π.χ. ως όρισμα σε μία μέθοδο).
 +</​WRAP>​
 +
 +Οι σχέσεις κληρονομικότητας μεταξύ παραμετρικών τύπων μπορούν να οριστούν ως εξής. Αν ένα παραμετρικό interface κληρονομεί ένα άλλο παραμετρικό interface τότε μπορούμε να πούμε ότι τα δύο interfaces διατηρούν την σχέση κληρονομικότητας ΜΟΝΟ αν ο παραμετρικός τύπος που χρησιμοποιούν είναι κοινός. Για παράδειγμα,​ η παρακάτω παραμετρική σχέση υποδηλώνει κληρονομικότητα ΜΟΝΟ για παραμέτρους ιδίου τύπου
 +<code java>
 +  Collection<​E> ​               Collection<​String> ​               Collection<​String>​
 +      |                               ​| ​                               Χ
 +      v          π.χ. ​                ​v ​           όχι όμως και ​       v
 +    List<​E> ​                      ​List<​String> ​                     List<​Integer>​
 +</​code>​
 +
 +Αντίστοιχα,​ αν μία παραμετρική κλάση κληρονομεί μία άλλη παραμετρική κλάση τότε μπορούμε να πούμε ότι οι δύο κλάσεις διατηρούν την σχέση κληρονομικότητας ΜΟΝΟ αν ο παραμετρικός τύπος που χρησιμοποιούν είναι κοινός. Δείτε το παρακάτω παράδειγμα
 +<code java>
 +  HashSet<​E> ​               HashSet<​String> ​                  ​HashSet<​String>​
 +      |                          |                                  Χ
 +      v          π.χ. ​           v             ​όχι όμως και ​        v
 +LinkedHashSet<​E> ​        ​LinkedHashSet<​String> ​              ​LinkedHashSet<​Integer>​
 +</​code>​
  
 Μπορείτε να υλοποιήσετε παραμετρικούς τύπους δεδομένων που κληρονομούν από άλλους παραμετρικούς τύπους δεδομένων. Για παράδειγμα από την standard βιβλιοθήκη της Java μπορείτε να δείτε ότι ο τύπος ''​ArrayList<​E>''​ υλοποιεί το interface ''​List<​E>''​. Το interface ''​List<​E>''​ με την σειρά του επεκτείνει το interface ''​Collection<​E>''​. Έτσι μπορεί να οριστεί η παρακάτω ιεραρχία Μπορείτε να υλοποιήσετε παραμετρικούς τύπους δεδομένων που κληρονομούν από άλλους παραμετρικούς τύπους δεδομένων. Για παράδειγμα από την standard βιβλιοθήκη της Java μπορείτε να δείτε ότι ο τύπος ''​ArrayList<​E>''​ υλοποιεί το interface ''​List<​E>''​. Το interface ''​List<​E>''​ με την σειρά του επεκτείνει το interface ''​Collection<​E>''​. Έτσι μπορεί να οριστεί η παρακάτω ιεραρχία
java/generics_inheritance.txt · Last modified: 2016/02/26 11:15 (external edit)