java:generics_inheritance
This is an old revision of the document!
Κληρονομικότητα παραμετρικών τύπων δεδομένων
public void boxTest(Box<Number> n) { /* ... */ } //line 1 Box<Number> box = new Box<Number>(); //line 3 box.add(new Integer(10)); //line 4 box.add(new Double(10.1)); //line 5 Box<Double> doubleBox = new Box<Double>(); // line 7 doubleBox.add(new Double(10.1)); // line 8 box.boxTest(doubleBox); // μπορούμε να γράψουμε?
Ο παραπάνω κώδικας είναι σωστός στις γραμμές 3-5 διότι οι κλάσεις Integer και Double είναι υποκλάσεις της κλάσης Number. Δεν ισχύει όμως το ίδιο για την γραμμή 8 καθώς η κλάση Box<Double> δεν είναι υποκλάση της κλάσης Box<Number>, όπως δείχνει το παρακάτω σχήμα. Box<Number> και Box<Double> είναι υποκλάσεις της κλάσης Object.
Μπορείτε να υλοποιήσετε παραμετρικούς τύπους δεδομένων που κληρονομούν από άλλους παραμετρικούς τύπους δεδομένων. Για παράδειγμα από την standard βιβλιοθήκη της Java μπορείτε να δείτε ότι ο τύπος ArrayList<E> υλοποιεί το interface List<E>. Το interface List<E> με την σειρά του επεκτείνει το interface Collection<E>. Έτσι μπορεί να οριστεί η παρακάτω ιεραρχία
Collection<E> Collection<String>
| |
v v
List<E> π.χ. List<String>
| |
v v
ArrayList<E> ArrayList<String>
java/generics_inheritance.1426774941.txt.gz · Last modified: 2015/03/19 14:22 (external edit)
