java:generics

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 [2015/03/15 19:47]
gthanos
java:generics [2015/03/15 20:20]
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 OrderedPair<​K,​ V> implements Pair<K, V> {
 +
 +    private K key;
 +    private V value;
 +
 +    public OrderedPair(K key, V value) {
 + this.key = key;
 + 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>​
 +
 +
 +
 +
 +
 +
 +
  
  
java/generics.txt · Last modified: 2017/02/17 15:01 by gthanos