====== Ρητές (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:inheritance | Κληρονομικότητα ]] | [[ :toc | Περιεχόμενα ]] | Επόμενο: [[ :java:inheritance_subclassing_vs_encapsulating | Κριτήριo χρήσης της κληρονομικότητας]]|