User Tools

Site Tools


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.1426454312.txt.gz · Last modified: 2015/03/15 21:18 by gthanos