java:generics

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Next revision Both sides next revision
java:generics [2015/03/15 19:32]
gthanos created
java:generics [2015/03/15 19:47]
gthanos
Line 1: Line 1:
-====== Generics ======+====== ​Παραμετρικοί τύποι δεδομένων (Generics======
  
-Ένας //generic// (γενικός) τύπος δεδομένων είναι ένας τύπος δεδομένων ο οποίος μπορεί να λαμβάνει ως παραμέτρους άλλους τύπους δεδομένων. Δείτε το παρακάτω παράδειγμα.+Ένας //generic// (γενικός) τύπος δεδομένων είναι ένας τύπος δεδομένων ο οποίος μπορεί να λαμβάνει ως παραμέτρους άλλους τύπους δεδομένων. Δείτε το παρακάτω παράδειγμα ​της κλάσης Box, η οποία θέλουμε να μπορεί να αποθηκεύσει οποιονδήποτε τύπο δεδομένων.
  
 <code java Box.java>​ <code java Box.java>​
Line 15: Line 15:
  
 <code java BoxUsage.java>​ <code java BoxUsage.java>​
-public BoxUsage {+public ​class BoxUsage {
    ​public static void main(String args[]) {    ​public static void main(String args[]) {
      Box b = new Box();      Box b = new Box();
      ​Integer n = new Integer(5);      ​Integer n = new Integer(5);
      ​b.set(n);​      ​b.set(n);​
-     ​String s = b.get();+     ​String s = (String)b.get();
    }    }
 } }
 </​code>​ </​code>​
 +
 +Ο παραπάνω κώδικας αφού μεταγλωττιστεί και επιχειρήσουμε να το τρέξουμε παράγει το παρακάτω exception
 +<​code>​
 +Exception in thread "​main"​ java.lang.ClassCastException:​ java.lang.Integer cannot be cast to java.lang.String
 +        at BoxUsage.main(BoxUsage.java:​7)
 +</​code>​
 +
 +Παρατηρήστε επίσης,​ ότι στην τελευταία γραμμή είμαστε υποχρεωμένοι να κάνουμε cast την επιστρεφόμενη τιμή της μεθόδου get() από Object σε String. Προκειμένου να αποφύγουμε τα παραπάνω προβλήματα και να είμαστε σίγουροι ότι ο κώδικας που γράφουμε δεν περιέχει λάθος χρήση τύπων δεδομένων η Java είσαγει τους γενικούς τύπους,​ γνωστούς ως generics. Η κλάση Box με χρήση Generics θα μπορούσε να γραφεί ως εξής:
 +
 +<code java Box.java>​
 +/**
 + * Generic version of the Box class.
 + * @param <T> the type of the value being boxed
 + */
 +public class Box<​T>​ {
 +  // T stands for "​Type"​
 +  private T t;
 +
 +  public void set(T t) { this.t = t; }
 +  public T get() { return t; }
 +}
 +</​code>​
 +
 +===== Ονοματολογία παραμέτρων =====
 +
 +  * E - Element (χρησιμοποείται στο Java Collections Framework)
 +  * K - Key
 +  * N - Number
 +  * T - Type
 +  * V - Value
 +  * S,U,V etc. - 2nd, 3rd, 4th types
 +
 +===== Δημιουργία και χρήση αντικειμένων ενός γενικού τύπου δεδομένων =====
 +
 +<code java>
 +Box<​Integer>​ integerBox = new Box<​Integer>​();​
 +</​code>​
 +
 +Εναλλακτικά μπορείτε να γράψετε
 +<code java>
 +Box<​Integer>​ integerBox = new Box<>​();​
 +</​code>​
 +
 +Εδώ ο compiler αντιλαμβάνεται ότι δημιουργείται μία μεταβλητή τύπου ''​Box<​Integer>''​ και δημιουργεί ένα αντικείμενο αυτού του τύπου
 +
 +**Προσοχή:​** το παραπάνω δεν είναι ίδιο με 
 +<code java>
 +Box<​Integer>​ integerBox = new Box();
 +</​code>​
 +
 +
 +
  
  
java/generics.txt · Last modified: 2017/02/17 15:01 by gthanos