java:generic_interface_example
Differences
This shows you the differences between two versions of the page.
Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
java:generic_interface_example [2016/04/14 15:13] – [Εισάγοντας μία νέα κλάση που υλοποιεί το Interface] gthanos | java:generic_interface_example [2020/02/25 09:34] (current) – external edit 127.0.0.1 | ||
---|---|---|---|
Line 1: | Line 1: | ||
- | ====== Παράδειγμα | + | ====== Παράδειγμα |
- | Ας επανέλθουμε στο παράδειγμα [[java:interfaces# | + | Ας επανέλθουμε στο παράδειγμα [[java:interface_as_data_type|χρήσης των interfaces ως τύπους δεδομένων]] και ας αλλάξουμε ελαφρά το interface MyComparable ώστε να περιέχει και την μέθοδο isEqual που ελέγχει την ισότητα. |
<code java MyComparable.java> | <code java MyComparable.java> | ||
Line 18: | Line 18: | ||
και είναι απαραίτητη ώστε να σηματοδοτήσουμε την πιθανή σύγκριση ασύμβατων μεταξύ τους τύπων δεδομένων. | και είναι απαραίτητη ώστε να σηματοδοτήσουμε την πιθανή σύγκριση ασύμβατων μεταξύ τους τύπων δεδομένων. | ||
- | Στη συνέχεια κατασκευάζουμε την κλάση Rectangle που υλοποιεί το συγκεκριμένο interface | + | Στη συνέχεια κατασκευάζουμε την κλάση Rectangle που υλοποιεί το συγκεκριμένο interface: |
<code java Rectangle.java> | <code java Rectangle.java> | ||
Line 90: | Line 90: | ||
</ | </ | ||
- | Παρατηρήστε ότι υλοποιούμε το interface MyComparable συγκρίνοντας τα αντικείμενου τύπου Rectangle με βάση το εμβαδόν τους. Επιπλέον | + | Παρατηρήστε ότι υλοποιούμε το //interface MyComparable// συγκρίνοντας τα αντικείμενου τύπου Rectangle |
<code java MyComparableUtil.java> | <code java MyComparableUtil.java> | ||
Line 117: | Line 117: | ||
} | } | ||
</ | </ | ||
+ | |||
+ | Τέλος η κλάση // | ||
<code java CompareObjects.java> | <code java CompareObjects.java> | ||
Line 135: | Line 137: | ||
- | Ας υποθέσουμε τώρα ότι θέλετε να φτιάξετε την κλάση Circle | + | Ας υποθέσουμε τώρα ότι θέλετε να φτιάξετε την κλάση |
<code java Circle.java> | <code java Circle.java> | ||
Line 187: | Line 189: | ||
</ | </ | ||
- | Αν αναδιαμορφώσουμε την // | + | Ας προσπαθήσουμε |
<code java CompareObjects.java> | <code java CompareObjects.java> | ||
Line 205: | Line 207: | ||
</ | </ | ||
- | παρατηρούμε ότι η παραπάνω κλάση μεταγλωττίζεται, | + | Παρατηρούμε ότι η παραπάνω κλάση μεταγλωττίζεται, |
+ | |||
+ | Προκειμένου να μπορούμε να συγκρίνουμε | ||
<code java TwoDShape.java> | <code java TwoDShape.java> | ||
Line 237: | Line 241: | ||
</ | </ | ||
- | <WRAP important | + | <WRAP important |
Παρατηρήστε τα εξής: | Παρατηρήστε τα εξής: | ||
- Η μέθοδος isLarger για τα διδιάστατα σχήματα βασίζεται στη μέθοδο getArea(). Η μέθοδος getArea() ορίζεται στην κλάση TwoDShape, αλλά η υλοποίηση της εξαρτάται από το εκάστοτε διδιάστατο σχήμα. Κατά συνέπεια, | - Η μέθοδος isLarger για τα διδιάστατα σχήματα βασίζεται στη μέθοδο getArea(). Η μέθοδος getArea() ορίζεται στην κλάση TwoDShape, αλλά η υλοποίηση της εξαρτάται από το εκάστοτε διδιάστατο σχήμα. Κατά συνέπεια, | ||
- | - H μέθοδος isLarger συγκρίνει τα διδιάστατα σχήματα με βάση το εμβαδό τους. Προκειμένου κάποια υποκλάση να μην επαναορίσει την μέθοδο isLarger με τρόπου που δεν είναι επιθυμητός, | + | - H μέθοδος isLarger συγκρίνει τα διδιάστατα σχήματα με βάση το εμβαδό τους. Προκειμένου κάποια υποκλάση να μην επαναορίσει την μέθοδο isLarger με τρόπο που δεν είναι επιθυμητός, |
</ | </ | ||
Line 392: | Line 396: | ||
</ | </ | ||
- | Ας υποθέσουμε τώρα ότι επιχειρούμε να μεταγλωττίσουμε και να τρέξουμε | + | Ας υποθέσουμε τώρα ότι επιχειρούμε συγκρίνουμε ένα διδιάστατο με ένα τρισδιάστατο σχήμα. Μεταβάλλουμε κατάληλλα την κλάση // |
<code java CompareObjects.java> | <code java CompareObjects.java> | ||
Line 402: | Line 406: | ||
Cuboid cuboid = new Cuboid(rect, | Cuboid cuboid = new Cuboid(rect, | ||
| | ||
- | System.out.println(" | + | System.out.println(" |
} catch(InvalidComparableTypeException ex) { | } catch(InvalidComparableTypeException ex) { | ||
System.err.println(" | System.err.println(" | ||
Line 410: | Line 414: | ||
</ | </ | ||
- | Ο παρακάτω κώδικας δεν θα έπρεπε να δουλεύει καθώς επιχειρεί να συγκρίνει ένα διδιάστατο με ένα τρισδιάστατο σχήμα που είναι μη συγκρίσιμα. Πράγματι δεν δουλεύει καθώς παράγει ένα exception InvalidComparableTypeException, αλλά μεταγλωττίζεται. Ιδανικά θα θέλαμε ένα σφάλμα αυτού του τύπου να το αντιληφθούμε κατά την μεταγλώττιση του προγράμματος και όχι κατά την εκτέλεση του. | + | Ο παρακάτω κώδικας δεν θα έπρεπε να δουλεύει καθώς επιχειρεί να συγκρίνει ένα διδιάστατο με ένα τρισδιάστατο σχήμα που είναι μη συγκρίσιμα. Πράγματι δεν δουλεύει καθώς παράγει ένα exception InvalidComparableTypeException. |
- | Η λύση στο | + | Η λύση στο πρόβλημα είναι η χρήση παραμετρικών τύπων δεδομένων (generics). __Οι παραμετρικοί τύποι δεδομένων έχουν την δυνατότητα να αντιλαμβάνονται ασυμβατότητες τύπων δεδομένων κατά την μεταγλώττιση και όχι κατά την εκτέλεση__. Δείτε πως διαμορφώνονται όλες οι παραπάνω κλάσεις με χρήση generics. |
+ | |||
+ | ===== Χρήση Generics για το προηγούμενο παράδειγμα ===== | ||
<code java MyComparable.java> | <code java MyComparable.java> | ||
Line 418: | Line 424: | ||
public interface MyComparable< | public interface MyComparable< | ||
public boolean isLarger(T other); | public boolean isLarger(T other); | ||
+ | public boolean isEqual(T other); | ||
} | } | ||
</ | </ | ||
Line 432: | Line 439: | ||
| | ||
public final boolean isEqual(TwoDShape other) { | public final boolean isEqual(TwoDShape other) { | ||
- | if( this.getArea() | + | if( this.getArea() |
return true; | return true; | ||
else | else | ||
Line 453: | Line 460: | ||
| | ||
public final boolean isEqual(ThreeDShape other) { | public final boolean isEqual(ThreeDShape other) { | ||
- | if( this.getArea() | + | if( this.getArea() |
return true; | return true; | ||
else | else | ||
Line 465: | Line 472: | ||
<code java MyComparableUtil.java> | <code java MyComparableUtil.java> | ||
- | public class TwosComparator | + | public class MyComparableUtil |
| | ||
public T findLarger(T object1, T object2) { | public T findLarger(T object1, T object2) { | ||
if (object1.isLarger(object2)) | if (object1.isLarger(object2)) | ||
return object1; | return object1; | ||
+ | else if (object1.isEqual(object2)) | ||
+ | return null; | ||
else | else | ||
return object2; | return object2; | ||
Line 477: | Line 486: | ||
if (!(object1.isLarger(object2))) | if (!(object1.isLarger(object2))) | ||
return object1; | return object1; | ||
+ | else if (object1.isEqual(object2)) | ||
+ | return null; | ||
else | else | ||
return object2; | return object2; | ||
Line 484: | Line 495: | ||
<WRAP important 80% center round> | <WRAP important 80% center round> | ||
- | Παρατηρήστε | + | Παρατηρήστε τα εξής: |
+ | - Δεν έχει νόημα η παραγωγή του InvalidComparableTypeException, | ||
+ | - Δεν είναι δυνατόν να ορίσετε την κλάση // | ||
</ | </ | ||
- | Αν προσπαθήσετε να μεταγλωττίσετε την CompareObjects θα δείτε ότι είναι αδύνατον να το κάνετε. | + | Προσαρμόζουμε κατάλληλα την κλάση // |
<code java CompareObjects.java> | <code java CompareObjects.java> | ||
public class CompareObjects { | public class CompareObjects { | ||
public static void main (String []args) { | public static void main (String []args) { | ||
- | | + | Point p = new Point(1, |
- | | + | Rectangle rect = new Rectangle(10, |
- | Rectangle rect = new Rectangle(10, | + | Cuboid cuboid = new Cuboid(rect, |
- | Cuboid cuboid = new Cuboid(rect, | + | |
| | ||
- | | + | MyComparableUtil< |
- | } catch(InvalidComparableTypeException ex) { | + | |
- | System.err.println(" | + | |
- | } | + | |
} | } | ||
} | } | ||
</ | </ | ||
+ | Το μήνυμα που εμφανίζει ο compiler είναι το παρακάτω | ||
+ | <code txt compiler-error.txt> | ||
+ | CompareObjects.java: | ||
+ | System.out.println(" | ||
+ | ^ | ||
+ | required: TwoDShape, | ||
+ | found: Rectangle, | ||
+ | reason: actual argument Cuboid cannot be converted to TwoDShape by method invocation conversion | ||
+ | where T is a type-variable: | ||
+ | T extends MyComparable< | ||
+ | </ | ||
- | + | | Προηγούμενο : [[ : | |
- | + | ||
- | + |
java/generic_interface_example.1460646823.txt.gz · Last modified: 2016/04/14 14:13 (external edit)