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 __η συγκεκριμένη μεταβλητή είναι και τύπου BasicRectangle. Επομένως, θα μπορούσαμε να γράψουμε

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

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

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

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

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

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

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

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

BasicRectangle r3 = new BasicRectangle(100,200);
Rectangle r4 = null;
if (r3 instanceof Rectangle) {
    r4 = (Rectangle)r3;
}
java/type_casting.1614959657.txt.gz · Last modified: 2021/03/05 15:54 (external edit)