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/19 11:44] gthanos [Παραμετρικοί τύποι δεδομένων (Generics)] |
java:generics [2015/03/19 13:53] gthanos [Παραμετρικοί τύποι δεδομένων με πολλές παραμέτρους] |
||
---|---|---|---|
Line 49: | Line 49: | ||
</code> | </code> | ||
- | Η παραπάνω δήλωση της κλάσης //Box// σημαίνει ότι κατά τον ορισμό αντικειμένων της κλάσης αυτά θα πρέπει να προσδιορίζουν έναν επιπλέον reference τύπο δεδομένων. δηλ μπορούμε να γράψουμε | + | Η παραπάνω δήλωση της κλάσης //Box// σημαίνει ότι κατά τον ορισμό αντικειμένων της κλάσης αυτά θα πρέπει να προσδιορίζεται ανάμεσα στους χαρακτήρες '<', ΄>' ένας επιπλέον reference τύπος δεδομένων, δηλ μπορούμε να γράψουμε |
<code java> | <code java> | ||
- | Box<String> = new Box<String>(); | + | Box<String> b1 = new Box<String>(); |
- | Box<Integer> = new Box<Integer>(); | + | Box<Integer> b2 = new Box<Integer>(); |
- | Box<Student> = new Box<Student>(); // όπου Student μία κλάση που έχουμε κατασκευάσει. | + | Box<Student> b3 = new Box<Student>(); // όπου Student μία κλάση που έχουμε κατασκευάσει. |
</code> | </code> | ||
+ | Ο τύπος δεδομένων που χρησιμοποιούμε ανάμεσα στους χαρακτήρες '<', ΄>' είναι ο τύπος δεδομένων που επιτρέπεται να αποθηκευθεί στην κλάση //Box// κάθε φορά. | ||
===== Ονοματολογία παραμέτρων ===== | ===== Ονοματολογία παραμέτρων ===== | ||
Line 90: | Line 91: | ||
===== Παραμετρικοί τύποι δεδομένων με πολλές παραμέτρους ===== | ===== Παραμετρικοί τύποι δεδομένων με πολλές παραμέτρους ===== | ||
+ | |||
+ | Πριν προχωρήσουμε σε ένα παράδειγμα παραμετρικών τύπων με πολλές παραμέτρους είναι χρήσιμο να πούμε ότι παραμετρικούς τύπους μπορούν να ορίζουν εκτός από κλάσεις και Interfaces. Δείτε το παρακάτω παράδειγμα. | ||
<code java Pair.java> | <code java Pair.java> | ||
Line 99: | Line 102: | ||
} | } | ||
</code> | </code> | ||
+ | <code java OrderedPair.java> | ||
public class OrderedPair<K, V> implements Pair<K,V> { | public class OrderedPair<K, V> implements Pair<K,V> { | ||
Line 114: | Line 118: | ||
public V getValue() { return value; } | public V getValue() { return value; } | ||
} | } | ||
- | <code java OrderedPair.java> | ||
- | |||
</code> | </code> | ||
Line 133: | Line 135: | ||
===== Απλοί παραμετρικοί τύποι δεδομένων (Raw Generic Types) ===== | ===== Απλοί παραμετρικοί τύποι δεδομένων (Raw Generic Types) ===== | ||
- | Εάν δεν χρησιμοποιήσουμε καμία παράμετρο τότε καταλήγουμε να έχουμε έναν "απλό" παραμετρικό τύπο δεδομένων γνωστό ως **Raw types**. Η χρήση των τύπων αυτών δυσκολεύει τον compiler να αποφασίσει για την ασφαλή ή μη χρήση δεδομένων αυτού του τύπου, ειδικά όταν τα δεδομένα αυτά χρησιμοποιούνται μαζί με παραμετρικούς τύπους δεδομένων. Δείτε τα παρακάτω παραδείγματα κώδικα | + | Αντικείμενα της κλάσης Box ορίζονται συνήθως σε συνδυασμό με ένα reference τύπο δεδομένων, όπως δείξαμε προηγούμενα. Υπάρχει η δυνατότητα να ορίσετε ένα αντικείμενο της κλάσης //Box// χωρίς την χρήση της επιπλέον παραμέτρου, όπως παρακάτω. |
+ | <code java> | ||
+ | Box b = new Box() | ||
+ | </code> | ||
+ | |||
+ | Σε αυτή την περίπτωση καταλήγουμε να έχουμε έναν μη-παραμετρικό τύπο δεδομένων. Ο compiler δεν είναι σε θέση να γνωρίζει τον τύπο δεδομένων που θα τοποθετήσετε στο συγκεκριμένο αντικείμενο. Ουσιαστικά η παραπάνω δήλωση ισοδυναμεί με μία δήλωση της μορφής | ||
+ | <code java> | ||
+ | Box<Object> b = new Box<Object>(); | ||
+ | </code> | ||
+ | |||
+ | Η προσπάθεια μεταγλώττισης του παρακάτω κώδικα καταδεικνύει το παραπάνω | ||
+ | <code java BoxUsage.java> | ||
+ | public class BoxUsage { | ||
+ | public static void main(String args[]) { | ||
+ | Box b = new Box(5); | ||
+ | Box<Number> bn = new Box<Number>(); | ||
+ | bn.set(b.get()); | ||
+ | } | ||
+ | } | ||
+ | </code> | ||
+ | |||
+ | Αν αλλάξετε την γραμμή ''Box<Number> bn = new Box<Number>();'' σε ''Box<Object> bn = new Box<Object>();'' το compilation error εξαφανίζεται και εμφανίζεται ένα warning. | ||
+ | |||
+ | Η μη χρήση των παραμετρικών τύπων δεδομένων δυσκολεύει τον compiler να αποφασίσει για την ασφαλή ή μη ασφαλή χρήση των δεδομένων που θα αποθηκευτούν στην κλάση. Δείτε τα παρακάτω παραδείγματα κώδικα | ||
<code java> | <code java> | ||
Line 150: | Line 175: | ||
rawBox.set(8); // warning: unchecked invocation to set(T) | rawBox.set(8); // warning: unchecked invocation to set(T) | ||
</code> | </code> | ||
+ | |||
==== Unchecked Error Messages ==== | ==== Unchecked Error Messages ==== |