User Tools

Site Tools


java:type_casting

Ρητές (explicit) και άρρητες (implicit) μετατροπές τύπων

Σε συνέχεια του παραδείγματος κληρονομικότητας της προηγούμενης ενότητας μπορούμε να γράψουμε

Rectangle r1 = new Rectangle(100,100,5,-5);

Από την παραπάνω δήλωση η μεταβλητή r1 είναι τύπου Rectangle. Επειδή όμως ο τύπος Rectangle κληρονομεί την κλάση BasicRectangle η μεταβλητή r1 είναι και τύπου BasicRectangle. Επομένως, θα μπορούσαμε να γράψουμε

BasicRectangle r2 = r1;
   //ή ισοδύναμα
BasicRectangle r2 = new Rectangle(100,100,5,-5);

Την παραπάνω ανάθεση την ονομάζουμε άρρητη μετατροπή (implicit casting) διότι αναθέτουμε ένα αντικείμενο του κληρονομούμενου τύπου δεδομένων (r1) σε μία μεταβλητή του γονικού τύπου (r2), χωρίς να ορίζουμε κάποια μετατροπή τύπου.

Αν θέλουμε να ζωγραφίσουμε τον κώδικα του προηγούμενου παραδείγματος μπορούμε να το κάνουμε όπως στο παρακάτω σχήμα. Παρατηρήστε ότι η μεταβλητές r1 και r2 δείχνουν στο ίδιο αντικείμενο. Η διαφορά είναι ότι η r2 αν και δείχνει σε ένα αντικείμενο τύπου Rectangle, έχει πρόσβαση μόνο στο τμήμα του αντικειμένου που είναι του τύπου BasicRectangle. Ο λόγος για αυτόν τον περιορισμό είναι ότι λόγω του τύπου της ο compiler υποθέτει ότι δείχνει σε ένα αντικείμενο τύπου BasicRectangle με αποτέλεσμα να μην επιτρέπει την πρόσβαση στα πεδία και τις μεθόδους που δεν ανήκουν στην κλάση BasicRectangle, αλλά στην υποκλάση.

Ρητή μετατροπή

Ας δοκιμάσουμε το ανάποδο παράδειγμα τώρα

BasicRectangle r3 = new Rectangle(100,200,5,-5);
Rectangle r4 = r3;

Σε αυτή την περίπτωση ο compiler διαμαρτύρεται, διότι η μεταβλητή r3 είναι τύπου BasicRectangle και όχι τύπου Rectangle. Αν θέλουμε να ξεπεράσουμε το παραπάνω μήνυμα λάθους του compiler θα πρέπει να γράψουμε το εξής:

BasicRectangle r3 = new Rectangle(100,200,5,-5);
Rectangle r4 = (Rectangle)r3;

Σε αυτή την περίπτωση ο προγραμματιστής βεβαιώνει τον compiler ότι η μεταβλητή r4 είναι και τύπου Rectangle. Την παραπάνω ανάθεση την ονομάζουμε ρητή μετατροπή (explicit casting). Επειδή δεν ισχύει η παραπάνω μετατροπή, κατά την εκτέλεση του προγράμματος θα παραχθεί μία εξαίρεση (exception). Θα δούμε πιο κάτω τι είναι οι εξαιρέσεις και πως τις διαχειριζόμαστε.

Ένας πιο ασφαλής τρόπος για να επαναλάβουμε τον παραπάνω κώδικα, χωρίς να παραχθεί εξαίρεση είναι ο παρακάτω. Εδώ η μετατροπή γίνεται αφού πρώτα γίνει έλεγχος ότι το αντικείμενο για το οποίο θα γίνει μετατροπή τύπου είναι και του νέου τύπου. Η μετατροπή θα γίνει μόνο εφόσον ο έλεγχος επιτύχει.

BasicRectangle r3 = new Rectangle(100,200,5,-5);
Rectangle r4;
if (r3 instanceof Rectangle) {
    r4 = (Rectangle)r3;
}
java/type_casting.txt · Last modified: 2021/04/05 15:09 (external edit)