User Tools

Site Tools


java:type_casting

This is an old revision of the document!


Ρητές (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), χωρίς να ορίζουμε κάποια μετατροπή τύπου.

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

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.1615839210.txt.gz · Last modified: 2021/03/15 20:13 by gthanos