This shows you the differences between two versions of the page.
Both sides previous revision Previous revision Next revision | Previous revision Next revision Both sides next revision | ||
java:generics [2015/03/15 19:47] gthanos |
java:generics [2015/03/15 20:35] gthanos [Παραμετρικοί τύποι δεδομένων με πολλές παραμέτρους] |
||
---|---|---|---|
Line 69: | Line 69: | ||
Εδώ ο compiler αντιλαμβάνεται ότι δημιουργείται μία μεταβλητή τύπου ''Box<Integer>'' και δημιουργεί ένα αντικείμενο αυτού του τύπου | Εδώ ο compiler αντιλαμβάνεται ότι δημιουργείται μία μεταβλητή τύπου ''Box<Integer>'' και δημιουργεί ένα αντικείμενο αυτού του τύπου | ||
- | **Προσοχή:** το παραπάνω δεν είναι ίδιο με | + | **Προσοχή:** το παραπάνω δεν είναι ίδιο με το παρακάτω. |
<code java> | <code java> | ||
Box<Integer> integerBox = new Box(); | Box<Integer> integerBox = new Box(); | ||
</code> | </code> | ||
+ | |||
+ | Στο τελευταίο ο compiler θα εκδώσει το παρακάτω warning. | ||
+ | <code> | ||
+ | Note: BoxUsage.java uses unchecked or unsafe operations. | ||
+ | Note: Recompile with -Xlint:unchecked for details. | ||
+ | </code> | ||
+ | |||
+ | ===== Παραμετρικοί τύποι δεδομένων με πολλές παραμέτρους ===== | ||
+ | |||
+ | <code java Pair.java> | ||
+ | public interface Pair<K, V> { | ||
+ | public K getKey(); | ||
+ | public V getValue(); | ||
+ | } | ||
+ | </code> | ||
+ | |||
+ | <code java OrderedPair.java> | ||
+ | public class Pair<K, V> { | ||
+ | |||
+ | private K key; | ||
+ | private V value; | ||
+ | |||
+ | public Pair(K key, V value) { | ||
+ | this.key = key; | ||
+ | this.value = value; | ||
+ | } | ||
+ | |||
+ | public void setKey(K key) { this.key = key; } | ||
+ | public void setValue(V value) { this.value = value; } | ||
+ | public K getKey() { return key; } | ||
+ | public V getValue() { return value; } | ||
+ | } | ||
+ | |||
+ | </code> | ||
+ | |||
+ | Με βάση τον παραπάνω κώδικα μπορείτε να δημιουργήσετε αντικείμενα επιμέρους τύπων ως εξής: | ||
+ | <code java OrderedPairUsage.java> | ||
+ | public class OrderedPairUsage { | ||
+ | public static void main(String args[]) { | ||
+ | Pair<String, Integer> p1 = new OrderedPair<String, Integer>("Even", 8); | ||
+ | Pair<String, String> p2 = new OrderedPair<String, String>("hello", "world"); | ||
+ | OrderedPair<String, Box<Integer>> p = new OrderedPair<>("primes", new Box<Integer>()); | ||
+ | // the following is not allowed | ||
+ | Pair<String, Integer> p1 = new OrderedPair<>("hello", "world"); | ||
+ | } | ||
+ | } | ||
+ | </code> | ||
+ | |||
+ | ===== Απλοί παραμετρικοί τύποι δεδομένων (Raw Generic Types) ===== | ||
+ | |||
+ | Εάν δεν χρησιμοποιήσουμε καμία παράμετρο τότε καταλήγουμε να έχουμε έναν "απλό" παραμετρικό τύπο δεδομένων γνωστό ως **Raw types**. Η χρήση των τύπων αυτών δυσκολεύει τον compiler να αποφασίσει για την ασφαλή ή μη χρήση δεδομένων αυτού του τύπου, ειδικά όταν τα δεδομένα αυτά χρησιμοποιούνται μαζί με παραμετρικούς τύπους δεδομένων. Δείτε τα παρακάτω παραδείγματα κώδικα | ||
+ | |||
+ | <code java> | ||
+ | Box<String> stringBox = new Box<>(); | ||
+ | Box rawBox = stringBox; // Safe - OK | ||
+ | </code> | ||
+ | |||
+ | <code java> | ||
+ | Box rawBox = new Box(); // rawBox is a raw type of Box<T> | ||
+ | Box<Integer> intBox = rawBox; // warning: unchecked conversion | ||
+ | </code> | ||
+ | |||
+ | <code java> | ||
+ | Box<String> stringBox = new Box<>(); | ||
+ | Box rawBox = stringBox; | ||
+ | rawBox.set(8); // warning: unchecked invocation to set(T) | ||
+ | </code> | ||
+ | |||
+ | ==== Unchecked Error Messages ==== | ||
+ | |||
+ | Όπως είπαμε προηγούμενα η μίξη generics με raw types μπορεί να δημιουργήσει warnings κατά την μεταγλώττιση της μορφής | ||
+ | <code> | ||
+ | Note: Example.java uses unchecked or unsafe operations. | ||
+ | Note: Recompile with -Xlint:unchecked for details. | ||
+ | </code> | ||
+ | όπως παρακάτω | ||
+ | <code java WarningDemo.java> | ||
+ | public class WarningDemo { | ||
+ | public static void main(String[] args){ | ||
+ | Box<Integer> bi; | ||
+ | bi = createBox(); | ||
+ | } | ||
+ | |||
+ | static Box createBox(){ | ||
+ | return new Box(); | ||
+ | } | ||
+ | } | ||
+ | </code> | ||
+ | Μεταγλωττίζοντας με το flag ''-Xlint:unchecked'' εμφανίζει την παραπάνω χρήση | ||
+ | <code> | ||
+ | WarningDemo.java:4: warning: [unchecked] unchecked conversion | ||
+ | found : Box | ||
+ | required: Box<java.lang.Integer> | ||
+ | bi = createBox(); | ||
+ | ^ | ||
+ | 1 warning | ||
+ | </code> | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||