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:23] – [Εισάγοντας μία νέα κλάση που υλοποιεί το 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 410: | Line 414: | ||
</ | </ | ||
- | < | + | Ο παρακάτω κώδικας |
- | Ο παρακάτω κώδικας | + | |
- | Η λύση στο πρόβλημα είναι η χρήση παραμετρικών τύπων δεδομένων (generics). __Οι παραμετρικοί τύποι δεδομένων έχουν την δυνατότητα να αντιλαμβάνονται ασυμβατότητες τύπων δεδομένων κατά την εκτέλεση και όχι κατά την | + | Η λύση στο πρόβλημα είναι η χρήση παραμετρικών τύπων δεδομένων (generics). __Οι παραμετρικοί τύποι δεδομένων έχουν την δυνατότητα να αντιλαμβάνονται ασυμβατότητες τύπων δεδομένων κατά την |
+ | |||
+ | ===== Χρήση Generics για το προηγούμενο παράδειγμα ===== | ||
<code java MyComparable.java> | <code java MyComparable.java> | ||
Line 419: | Line 424: | ||
public interface MyComparable< | public interface MyComparable< | ||
public boolean isLarger(T other); | public boolean isLarger(T other); | ||
+ | public boolean isEqual(T other); | ||
} | } | ||
</ | </ | ||
Line 433: | 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 454: | 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 471: | Line 477: | ||
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 478: | 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 485: | Line 495: | ||
<WRAP important 80% center round> | <WRAP important 80% center round> | ||
- | Παρατηρήστε | + | Παρατηρήστε τα εξής: |
+ | - Δεν έχει νόημα η παραγωγή του InvalidComparableTypeException, | ||
+ | - Δεν είναι δυνατόν να ορίσετε την κλάση // | ||
</ | </ | ||
- | Αν προσπαθήσετε να μεταγλωττίσετε την CompareObjects θα δείτε ότι είναι αδύνατον να το κάνετε. | + | Προσαρμόζουμε κατάλληλα την κλάση // |
<code java CompareObjects.java> | <code java CompareObjects.java> | ||
Line 497: | Line 509: | ||
Cuboid cuboid = new Cuboid(rect, | Cuboid cuboid = new Cuboid(rect, | ||
| | ||
- | MyComparableUtil util = new MyComparableUtil(); | + | MyComparableUtil< |
| | ||
System.out.println(" | System.out.println(" | ||
Line 504: | Line 516: | ||
</ | </ | ||
+ | Το μήνυμα που εμφανίζει ο 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.1460647381.txt.gz · Last modified: 2016/04/14 14:23 (external edit)