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/15 20:35]
gthanos [Παραμετρικοί τύποι δεδομένων με πολλές παραμέτρους]
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