java:type_casting

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

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

MountainBike myBike = new MountainBike();

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

Bicycle myBicycle = myBike;
   //ή
Βicycle yourBicycle = new MountainBike();

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

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

Bycycle myBicycle = new Bicycle();
MountainBike myBike = myBicycle;

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

Bycycle myBicycle = new Bicycle();
MountainBike myBike = (MountainBike) myBicycle;

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

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

Bycycle myBicycle = new Bicycle();
MountainBike myBike;
if (myBicycle instanceof MountainBike) {
    myBike = (MountainBike)myBicycle;
}
java/type_casting.txt · Last modified: 2017/02/16 13:34 by gthanos