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 20:04]
gthanos
java:generics [2015/03/16 06:35]
gthanos [Παραμετρικοί τύποι δεδομένων (Generics)]
Line 31: Line 31:
 </​code>​ </​code>​
  
-Παρατηρήστε επίσης,​ ότι στην τελευταία γραμμή είμαστε υποχρεωμένοι να κάνουμε cast την επιστρεφόμενη τιμή της μεθόδου get() από Object σε String. Προκειμένου να αποφύγουμε τα παραπάνω προβλήματα και να είμαστε σίγουροι ότι ο κώδικας που γράφουμε δεν περιέχει λάθος χρήση τύπων δεδομένων η Java είσαγει τους ​γενικούς τύπους,​ γνωστούς ως generics. Η κλάση Box με χρήση Generics θα μπορούσε να γραφεί ως εξής:+Παρατηρήστε επίσης,​ ότι στην τελευταία γραμμή είμαστε υποχρεωμένοι να κάνουμε cast την επιστρεφόμενη τιμή της μεθόδου get() από Object σε String. Προκειμένου να αποφύγουμε τα παραπάνω προβλήματα και να είμαστε σίγουροι ότι ο κώδικας που γράφουμε δεν περιέχει λάθη στη ​χρήση τύπων δεδομένων η Java εισάγει τους ​παραμετρικούς τύπους ​δεδομένων, γνωστούς ως Generics. Η κλάση Box με χρήση Generics θα μπορούσε να γραφεί ως εξής:
  
 <code java Box.java>​ <code java Box.java>​
Line 90: Line 90:
  
 <code java OrderedPair.java>​ <code java OrderedPair.java>​
-public class OrderedPair<​K,​ V> implements ​Pair<K, V> {+public class Pair<K, V> {
  
     private K key;     private K key;
     private V value;     private V value;
  
-    public ​OrderedPair(K key, V value) { +    public ​Pair(K key, V value) { 
- this.key = key; +        this.key = key; 
- this.value = value;+        this.value = value;
     }     }
  
-    public K getKey() { return key; }+    ​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; }     public V getValue() { return value; }
 } }
 +
 </​code>​ </​code>​
  
Line 112: Line 115:
     Pair<​String,​ String> ​ p2 = new OrderedPair<​String,​ String>​("​hello",​ "​world"​);​     Pair<​String,​ String> ​ p2 = new OrderedPair<​String,​ String>​("​hello",​ "​world"​);​
     OrderedPair<​String,​ Box<​Integer>>​ p = new OrderedPair<>​("​primes",​ new Box<​Integer>​());​     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>​ </​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