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>
, όπως δείχνει το παρακάτω σχήμα.
Μπορείτε να υλοποιήσετε παραμετρικούς τύπους δεδομένων που κληρονομούν από άλλους παραμετρικούς τύπους δεδομένων. Για παράδειγμα από την 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.1426455743.txt.gz · Last modified: 2015/03/15 21:42 (external edit)